MVVM模型验证和数据绑定?

MVVM模型验证和数据绑定?

问题描述:

当在WPF MVVM中查找用于做属性验证的最佳实践的教程时,我看到很多人使用接口IDataErrorInfo我只是想知道是否可以像ASP.Net MVC中使用属性一样设置自动验证?MVVM模型验证和数据绑定?

任何人都可以获取MVVM中模型验证的最佳实践吗?验证应该在基础模型类上吗?或在视图模型类?

Silverlight有一个控件调用该作品使用DataAnnotations属性,有人还跟port that control to WPF数据形。我相信这符合你所寻找的东西。

我的看法是,验证应在视图模型,而不是模型,因为:

  • 验证是不正确的输入 和UI的第一个逻辑点 视图模型。这是很好的做法, 验证,并在 视图模型结束请求,而不是跨无效 数据发送到型号
  • 还很多时候模型是传统和假设是,他们 不能修改。 ViewModel创建了 一个很好的包装模型。

如果您使用任何依赖注入工具来处理像Unity,Windsor Castle等应用程序,则可以使用拦截器来验证ViewModels。在调用ViewModel方法之前先调用拦截器。

使用拦截器与城堡的一个例子可以在这里找到 - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html

这些都是很好的问题!验证属于Model和ViewModel(s)。下面是我通常的做法:

首先,我尽可能多地在模型中进行了验证 - 这些将是独立于给定演示文稿的规则。例如,如果您的域中的员工没有EmployeeNumber属性不为空,并且长度为六个字符,并且六个字符中的每个字符都必须是数字,则该员工无效。

其次,我有一个实现IDataErrorInfo的基础ViewModel类。在这个基类中,我基本上询问模型是否有效,如果不是,则会触发错误(由于IDataErrorInfo而易于转换为视图)。我也使IDataError信息虚拟的实现方法,因为...

最后,将会有给定演示文稿独特的边缘案例,该模型无法捕获。对于一个(人为的)例子,假设你有一个演示文稿,如果只输入了他的名字和姓氏,那么雇员是有效的,另一个演示文稿需要中间的首字母。尽管您当然可以并且应该在Employee中拥有FullName组件/ valueObject属性以验证该属性不为null,但您需要每个演示文稿的子类ViewModel,以了解在这种情况下,Fullame属性的用户条目是否有效。

最后,你可以也应该为模型验证使用验证器 - 我喜欢NHibernateValidator,但肯定还有其他(非常)好的可用。其中大部分,包括NHibernate的,都会支持你正在寻找的属性验证。然而,我更喜欢清洁的替代属性,因此我在验证器中为单独的项目(即MyDomainImpl)设置了所有验证规则。在模型中噪音更少的清洁剂,以及更清晰的关注点分离。

如果您需要,随时提出问题也给自己一些工作时间,直到你有一个适合你的方法 - 这是而不是一个小问题。

HTH,
Berryl

如果把验证逻辑?

软件系统大多需要验证某种 以确保 业务逻辑必须处理仅 正确的数据。这些验证 规则由业务 模型定义,因此域图层是 实施它们的正确位置。只要 请记住,你不要开始 重复 业务对象之间的验证码。

link

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