使用数据模型范围内的命令
本文关键字:命令 范围内 数据模型 | 更新日期: 2023-09-27 18:32:46
在我的程序中,我正在尝试为用户控件编写命令,该命令将切换几个控件的isEnabled
和isChecked
属性。附加到我的用户控件的是视图模型和数据模型。我的命令和属性在我的数据模型中(首先,这是正确的实现吗?),并且在我的视图模型中有一个数据模型的属性。
命令不起作用。我没有收到任何绑定错误,并且在调试代码时,值已正确更改。但是,没有视觉反馈。
我的视图模型在其构造函数中设置为用户控件的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
中实现。
在模型中或模型中,应将属性绑定到控件的IsChecked
和IsEnabled
属性,并且在命令中,更改属性将触发将更新视图的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}" ... />