C# 在数据模型范围内使用命令
在我的程序中,我试图为一个用户控件编写命令,该控件将切换一些控件的C# 在数据模型范围内使用命令,c#,wpf,mvvm,command,C#,Wpf,Mvvm,Command,在我的程序中,我试图为一个用户控件编写命令,该控件将切换一些控件的isEnabled和isChecked属性。附加到我的用户控件的是视图模型和数据模型。我的命令和属性在我的数据模型中(首先,这是正确的实现吗?) 命令不起作用。我没有得到任何绑定错误,当我调试代码时,值被正确更改。但是,没有视觉反馈 我的视图模型被设置为其构造函数中用户控件的DataContext 我的数据是这样绑定的: <CheckBox Command="{Binding Model.myCommand}" ... /&
isEnabled
和isChecked
属性。附加到我的用户控件的是视图模型和数据模型。我的命令和属性在我的数据模型中(首先,这是正确的实现吗?)
命令不起作用。我没有得到任何绑定错误,当我调试代码时,值被正确更改。但是,没有视觉反馈
我的视图模型被设置为其构造函数中用户控件的DataContext
我的数据是这样绑定的:
<CheckBox Command="{Binding Model.myCommand}" ... />
为什么这些命令不起作用?首先,您的
命令属性应该在ViewModel中,而不是数据模型中
除此之外,您不应该将复选框
绑定到命令
-命令用于触发操作的元素(例如单击按钮
)。复选框
应绑定到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):
命令应在视图模型中实现
在那里或模型中,应该将属性绑定到控件的IsChecked
和IsEnabled
属性,在命令中,更改属性将触发PropertyChanged
事件,该事件将更新视图
例如:
在你看来:
<StackPanel>
<Button Command="{Binding ToggleCommand}"/>
<CheckBox IsChecked="{Binding Path=Model.IsChecked}"/>
<CheckBox IsEnabled="{Binding Path=Model.IsEnabled}"/>
</StackPanel>
型号:
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
}
希望这有帮助您以完全错误的方式使用命令。对于初学者,您将其绑定到myCommand
,而模型中的名称为myCommand\u C
请告诉我如何正确执行。我应该将它绑定到模型。MyCommand_C
?请阅读以下内容:。我甚至应该使用命令来执行这些操作吗?我使用Prism框架,因此使用DelegateCommand
和RaisePropertyChanged
lambda表达式,但是这个概念在MVVM中非常基本,并且可以在任何MVVM框架中完成。这一切都是有意义的,但是,如果我将所有属性移到我的ViewModel,我的数据模型有什么意义呢?@Ericafterdark根据您的评论更新了我的答案。希望这能让事情变得更糟clear@Ericafterdark您不必将任何属性移动到ViewModel
。您可以使用绑定中的路径
直接绑定到它们。。。
<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
}