Rumah > pembangunan bahagian belakang > C++ > Mengapa Butang WPF Saya Tidak Terikat pada Perintah ViewModelBase Berfungsi?

Mengapa Butang WPF Saya Tidak Terikat pada Perintah ViewModelBase Berfungsi?

Susan Sarandon
Lepaskan: 2025-01-12 20:41:43
asal
702 orang telah melayarinya

Why Doesn't My WPF Button Bound to a ViewModelBase Command Work?

Selesaikan masalah bahawa butang mengikat arahan ViewModelBase dalam WPF adalah tidak sah

Perihalan masalah: Mengikat butang WPF pada arahan yang ditakrifkan dalam kelas ViewModelBase mungkin gagal, menyebabkan butang menjadi tidak bertindak balas.

Penyelesaian:

Masalahnya terletak pada pelaksanaan ViewModelBase dan sintaks pengikatan butang. Berikut ialah penyelesaian WPF lengkap dan contoh berfungsi:

Teg XAML untuk butang:

Bahagian kod XAML ini tiada dan contoh lengkap tidak boleh diberikan. Anda perlu menyediakan elemen <Button> dan pengikatan atribut Commandnya, contohnya:

<code class="language-xml"><Button Content="Click Me" Command="{Binding ClickCommand}" /></code>
Salin selepas log masuk

Kod di belakang untuk tetingkap:

<code class="language-csharp">public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModelBase();
    }
}</code>
Salin selepas log masuk

Kelas ViewModelBase:

<code class="language-csharp">public class ViewModelBase : INotifyPropertyChanged // 添加INotifyPropertyChanged接口
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ICommand _clickCommand;
    public ICommand ClickCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), () => CanExecute));
        }
    }

    public bool CanExecute
    {
        get
        {
            // 检查命令是否可执行
            return true;
        }
    }

    public void MyAction()
    {
        // 按钮点击时执行的操作
        MessageBox.Show("Button Clicked!");
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}</code>
Salin selepas log masuk

Kelas CommandHandler:

<code class="language-csharp">public class CommandHandler : ICommand
{
    private Action _action;
    private Func<bool> _canExecute;

    public CommandHandler(Action action, Func<bool> canExecute)
    {
        _action = action;
        _canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute?.Invoke() ?? false; //处理空值
    }

    public void Execute(object parameter)
    {
        _action?.Invoke(); //处理空值
    }
}</code>
Salin selepas log masuk

Contoh penggunaan:

Dalam senario khusus anda, anda harus membuat instantiate DataInitializationCommand sebagai contoh baharu CommandHandler dalam pembina paparan:

<code class="language-csharp">public AttributeView()
{
    InitializeComponent(); // 添加初始化组件
    DataInitialization = new CommandHandler(DataInitializationAction, CanExecuteReinitialize);
}</code>
Salin selepas log masuk

Dalam contoh ini, pastikan DataInitializationAction ialah kaedah yang anda mahu laksanakan apabila butang diklik, CanExecuteReinitializesemak sama ada arahan itu harus didayakan atau dilumpuhkan semasa masa jalan. Ingat untuk melaksanakan antara muka ViewModelBase dalam INotifyPropertyChanged dan api peristiwa perubahan sifat dengan betul supaya UI boleh bertindak balas terhadap perubahan dalam ViewModel.

Sila ambil perhatian bahawa contoh ini memerlukan penambahan yang perlu menggunakan pernyataan, seperti System.Windows.Input, System.ComponentModel, System.Runtime.CompilerServices. Dan ClickCommand perlu diikat dengan betul pada atribut Command butang dalam XAML. Kod XAML yang hilang adalah bahagian penting dalam contoh ini dan perlu dilengkapkan sebelum ia boleh dijalankan.

Atas ialah kandungan terperinci Mengapa Butang WPF Saya Tidak Terikat pada Perintah ViewModelBase Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan