MVVM模型验证和数据绑定?

3

在寻找WPF MVVM属性验证最佳实践的教程时,我看到很多人使用接口IDataErrorInfo。我想知道是否可以像ASP .Net MVC中使用属性一样设置自动验证。

有人能建议MVVM模型验证的最佳实践是什么吗?验证应该在基本模型类上进行还是在视图模型类上进行?

4个回答

3
银光(Silverlight)有一个名为DataForm的控件,它使用DataAnnotations属性工作,有人很好心地将该控件移植到WPF。我相信这正是您要寻找的东西。

2
这些是好问题!验证应该同时存在于模型和ViewModel中。这是我通常的做法:
首先,我尽可能把验证规则放在模型中,这些规则与特定呈现无关。例如,假设你的领域中的员工如果没有一个不为空且长度为6个字符的EmployeeNumber属性,并且每个字符都必须是数字,则不合法。
其次,我有一个实现了IDataErrorInfo的基本ViewModel类。在这个基类中,我基本上询问模型是否有效,如果无效则触发错误(通过IDataErrorInfo很容易将其转换为视图)。我还使IDataError info的实现方法虚拟,因为......
最后,对于特定呈现而言,会有一些无法由模型捕获的边缘情况。例如,假设您有一个呈现,在其中仅输入名字和姓氏的员工是有效的,而另一个呈现则需要输入中间名字。虽然您肯定可以并且应该在员工中有一个FullName组件/值对象属性来验证该属性不为空,但在这种情况下,您需要为每个呈现创建子类化的ViewModel,以知道FullName属性的用户输入是否有效。
最后,你可以并且应该为你的模型验证使用一个验证器 - 我喜欢NHibernateValidator,但还有其他(非常)好的可用。其中大多数,包括NHibernate的,都将支持你正在寻找的属性验证。然而,我更喜欢一种更干净的替代方案,即在一个单独的项目中(即MyDomainImpl)设置我的验证器的所有验证规则。相对于模型来说,这种方式更加简洁,并且能够更好地分离关注点。
如果需要,请随时提问。同时给自己一些时间来处理这个问题,直到你有一个适合自己的方法为止 - 这不是一个琐碎的话题。
希望有所帮助, Berryl

1

我的看法是验证应该在ViewModel上进行,而不是在Model上进行,因为:

  • 验证是针对不正确的输入的,UI的第一个逻辑点是ViewModel。在ViewModel上进行验证并停止请求是很好的实践,不要将无效数据发送到Model。
  • 此外,许多时候Model是遗留的,假设它们不能被修改。ViewModel在模型上创建了一个良好的包装器。

如果您正在使用任何依赖注入工具,如Unity、Windsor Castle等,您可以使用拦截器来验证ViewModels。拦截器在调用ViewModel方法之前首先被调用。

使用Castle的拦截器示例可以在此处找到 - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html


1

如何放置验证逻辑?

软件系统通常需要某种形式的验证,以确保业务逻辑只处理正确的数据。这些验证规则由业务模型定义,因此域层是实现它们的正确位置。只需记住不要在业务对象之间开始复制验证代码。

link

.

您可能会对WPF应用程序框架(WAF)的示例应用程序感兴趣。它们展示了如何将.NET DataAnnotations验证属性与MVVM模式一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接