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

标签 c# wpf validation mvvm

我正在使用带有 MVVM 模式的 WPF,并且刚刚开始一个非常大的项目。

为了分离关注点,我想将所有验证规则放入我的数据模型中。

但是当我回顾如何进行 WPF 验证时,我能找到的所有示例都显示了如何使用持有验证规则的 ViewModel 进行验证。其中一些示例展示了对 WPF 的一些真正深刻的理解并且非常酷。

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

最佳答案

使用 IDataErrorInfo 的验证(如果这是您正在使用的)将发生在绑定(bind)到 View 上的对象上。

如果你有

<TextBox Text="{Binding Name}" />

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

<TextBox Text="{Binding Model.Name}" />

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

View 模型:

public string this[string propname]
{
     get { return _model[propname]; }
}

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

View 模型:

public string SomeProperty
{
     get { reutrn _model.SomeProperty; }
     set {
           _model.OtherProperty = value; 
           RaisePropertyChanged("SomeProperty");
         }
}

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

在非常复杂的场景中,将验证与模型和 View 模型分开并让 View 模型和数据模型都使用它可能会更好。

关于c# - 如何在 WPF ViewModel 中使用模型验证规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119878/

相关文章:

c# - 如何将 AsParallel 与 async 和 await 关键字一起使用?

c# - Where 子句中有两个条件求和的 SQL 语句错误

JavaScript 电子邮件验证 - @ 之前的字符串变量

c# - 无法在 visual studio 2015 中运行 android ddms

c# - 代码隐藏找不到在 XAML 中声明的控件

WPF - DataTemplate 中的 CollectionViewSource Filter 事件不起作用

wpf - "Week of the year"算法需要改进

validation - Laravel 验证可为空或数字

azure - 在 Azure 中使用 If Else 逻辑创建带有审批网关的管道/机制以检测增量数据质量

C# WPF Caliburn Micro TreeViewItem.Expanded 事件未触发