我正在使用WPF和MVVM模式,只是启动一个非常大的项目。
为了保持关注点,我想将所有验证规则放入我的数据模型中。
但是当我查看如何进行WPF验证时,我能找到的所有示例都显示了如何使用包含验证规则的ViewModel来完成它。其中一些例子显示了对WPF的一些真正深刻的理解,并且非常酷。
在这个特定的应用程序中,我在编辑和模型的ViewModel之间有一个1:1的映射,所以我可以把它放在ViewModels中。但它感觉不对。
答案 0 :(得分:3)
使用IDataErrorInfo
验证(如果您正在使用的话)将发生在视图上绑定的对象上。
所以,如果你有
<TextBox Text="{Binding Name}" />
这将在ViewModel上。但是,如果将模型公开为视图模型上的属性,则验证将在数据模型上进行。
<TextBox Text="{Binding Model.Name}" />
使用第一个选项,您可以绑定到视图模型属性并路由到包含实际验证的数据模型,然后在视图模型上实现IDataErrorInfo
并将验证路由到模型
视图模型:
public string this[string propname]
{
get { return _model[propname]; }
}
仅当您在模型上实际设置所需的属性以使验证生效时,此功能才有用
视图模型:
public string SomeProperty
{
get { reutrn _model.SomeProperty; }
set {
_model.OtherProperty = value;
RaisePropertyChanged("SomeProperty");
}
}
但是我更喜欢第二个绑定选项,因为这个问题是它不是很干,所以我几乎总是将DataModel暴露为视图模型上的属性(因为它负责数据)并离开ViewModel管理视图的模型,更多地是关于UI如何与数据交互。
在非常复杂的场景中,最好将验证与模型和视图模型分开,并让视图模型和数据模型都使用它。