如何在WPF ViewModel中使用模型验证规则

pho*_*tom 7 c# validation wpf mvvm

我正在使用WPF和MVVM模式,只是启动一个非常大的项目.

为了保持关注点,我想将所有验证规则放入我的数据模型中.

但是当我查看如何进行WPF验证时,我能找到的所有示例都显示了如何使用包含验证规则的ViewModel来完成它.其中一些示例显示了对WPF的一些真正深刻的理解,并且非常酷.

在这个特定的应用程序中,我在编辑和模型的ViewModel之间有一个1:1的映射,所以我可以把它放在ViewModels中.但它感觉不对.

aqw*_*ert 3

验证使用IDataErrorInfo(如果这就是您正在使用的)将在绑定到视图上的对象上进行。

所以如果你有

<TextBox Text="{Binding Name}" />
Run Code Online (Sandbox Code Playgroud)

这将在 ViewModel 上。但是,如果您将模型公开为视图模型上的属性,则验证将在您的数据模型上进行。

<TextBox Text="{Binding Model.Name}" />
Run Code Online (Sandbox Code Playgroud)

使用第一种选择,您可以绑定到视图模型属性并路由到包含实际验证的数据模型,然后只需IDataErrorInfo在视图模型上实现并将验证路由到模型

视图模型:

public string this[string propname]
{
     get { return _model[propname]; }
}
Run Code Online (Sandbox Code Playgroud)

仅当您实际在模型上设置了验证工作所需的属性时,这才有用

视图模型:

public string SomeProperty
{
     get { reutrn _model.SomeProperty; }
     set {
           _model.OtherProperty = value; 
           RaisePropertyChanged("SomeProperty");
         }
}
Run Code Online (Sandbox Code Playgroud)

然而,我更喜欢第二个绑定选项,因为它的问题是它不是很干燥,所以我几乎总是将 DataModel 作为视图模型上的属性公开(因为它负责数据)并让 ViewModel 管理视图的模型,更多的是关于 UI 如何与数据交互。

在非常复杂的场景中,最好将验证与模型和视图模型分开,并让视图模型和数据模型都使用它。