使用数据模型范围内的命令

本文关键字:命令 范围内 数据模型 | 更新日期: 2023-09-27 18:32:46

在我的程序中,我正在尝试为用户控件编写命令,该命令将切换几个控件的isEnabledisChecked属性。附加到我的用户控件的是视图模型和数据模型。我的命令和属性在我的数据模型中(首先,这是正确的实现吗?),并且在我的视图模型中有一个数据模型的属性。

命令不起作用。我没有收到任何绑定错误,并且在调试代码时,值已正确更改。但是,没有视觉反馈。

我的视图模型在其构造函数中设置为用户控件的DataContext

我的数据绑定如下:

<CheckBox Command="{Binding Model.myCommand}" ... />

这是我的一个命令的示例:

public Command myCommand { get { return _myCommand; } }
private void MyCommand_C()
{
       if (_myCommand== true) //Checked
       {
           _checkBoxEnabled = true;
       }
       else //UnChecked
       {
           _checkBoxEnabled = false;
           _checkBox = false;
       }
}

为什么这些命令不起作用?

使用数据模型范围内的命令

Commands应该在ViewModel中实现。

在模型中或模型中,应将属性绑定到控件的IsCheckedIsEnabled属性,并且在命令中,更改属性将触发将更新视图的PropertyChanged事件。

例:

在您看来:

    <StackPanel>
        <Button Command="{Binding ToggleCommand}"/>
        <CheckBox IsChecked="{Binding Path=Model.IsChecked}"/>
        <CheckBox IsEnabled="{Binding Path=Model.IsEnabled}"/>
    </StackPanel>

视图模型:

public class MainWindowViewModel : NotificationObject
{
    public MainWindowViewModel()
    {
        Model = new MyModel();
        ToggleCommand = new DelegateCommand(() =>
            {
                Model.IsChecked = !Model.IsChecked;
                Model.IsEnabled = !Model.IsEnabled;
            });
    }
    public DelegateCommand ToggleCommand { get; set; }
    public MyModel Model { get; set; }
}

型:

public class MyModel : INotifyPropertyChanged
{
    private bool _isChecked;
    private bool _isEnabled;
    public bool IsChecked
    {
        get
        {
            return _isChecked;
        }
        set
        {
            _isChecked = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
        }
    }
    public bool IsEnabled
    {
        get
        {
            return _isEnabled;
        }
        set
        {
            _isEnabled = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsEnabled"));
        }
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

希望这有帮助

首先,Command属性应位于 ViewModel 中,而不是数据模型中。

撇开这一点不谈,您不应将CheckBox绑定到Command - 命令适用于触发操作(例如单击Button)的元素。 CheckBox应绑定到bool属性。 属性应该驻留的位置可以争论,但我的观点是它应该在 ViewModel 中,以便您可以将属性更改通知逻辑排除在数据模型之外。

举个简单的例子:

public class MyViewModel : INotifyPropertyChanged
{
    private bool _myCheckValue;
    public bool MyCheckValue
    {
        get { return _myCheckValue; }
        set 
        {
            _myCheckValue = value;
            this.RaisePropertyChanged("MyCheckValue");
        }
    }
    //INotifyPropertyChange implementation not included...
}

然后在 XAML 中(假设 ViewModel 是 DataContext):

<CheckBox IsChecked="{Binding MyCheckValue}" ... />