WPF 中的验证 - 自定义验证规则或 IDataErrorInfo

9
作为一名新的WPF程序员,我找不到验证用户输入的两种不同方式之间的区别:
编写自定义验证规则与实现IDataErrorInfo相比有什么优缺点?我应该在何时选择其中之一?
更新:
虽然我已经得到了答案,但我发现这篇相关文章可能会对其他人有所帮助。
3个回答

21

基本上,如果实现了 IDataErrorInfo 接口,验证将在绑定的对象中实现;而如果实现了验证规则,则验证将在绑定的对象所附加的对象中实现。

个人而言,如果你正在使用 MVVM 模式,我认为你必须疯了才会使用除了 IDataErrorInfo 以外的其他任何东西。你希望验证逻辑居于视图模型之中,这样它就是集中且可测试的。如果它被放在视图中,那么你的验证逻辑可能错漏百出,而要找到问题的唯一方法就是手动测试你的视图。这是一个可避免的严重错误来源。

有些情况下,使用验证规则是有意义的 - 例如,如果你正在围绕着“哑”对象(例如,XmlDataSource)构建 UI。但对于大多数生产应用程序,我不会接近它。


3
使用ValidationRule的一个潜在好处是,在ViewModel更改为不正确的值之前,您可以检查值的正确性。 - Marcin Rybacki
3
如果您使用MVVM模式,则应仅在特定情况下使用ValidationRules。如果您使用ValidationRule来防止视图中输入的数据进入视图模型,那么视图模型就不再是视图的模型。理解所有这些内容已经很困难了,不要让它更加晦涩难懂。 - Robert Rossney
2
但是ValidationRule似乎是自定义错误消息的唯一方法。 - GorillaApe

1

IDataErrorInfo

  • 验证逻辑保留在视图模型中,易于实现和维护
  • 对视图模型中的所有字段具有完全控制权

验证规则

  • 将验证规则保留在单独的类中
  • 提高可重用性。例如,您可以实现必填字段验证类,并在整个应用程序中重复使用它。

我的观点是,对于常见的验证,如必填字段验证、电子邮件地址验证,您可以使用验证规则。如果您需要进行自定义验证,例如范围验证或其他自定义验证,请使用IDataerrorinfo。


-1

您可以实现IDataErrorInfo接口,以便能够轻松使用数据绑定。但是您仍然需要构建自定义的验证规则。


我不确定我完全理解了你的回答:我可以实现IDataErrorInfo,或者继承ValidationRule并重写“Validate”方法...但我不会同时使用它们。我错了吗? - ET.

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