使用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 如何与数据交互。
在非常复杂的场景中,最好将验证与模型和视图模型分开,让视图模型和数据模型都使用它。