在我的程序中,我正在尝试为用户控件编写命令,该命令将切换几个控件的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;
}
}
为什么这些命令不起作用?
答案 0 :(得分:1)
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
}
希望这有帮助
答案 1 :(得分:0)
首先,您的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}" ... />