IDataErrorInfo与ValidationRule vs Exception

时间:2010-06-05 15:03:50

标签: wpf idataerrorinfo

任何人都可以告诉我哪种方法更适合WPF中的验证。

  1. 实施IDataErrorInfo
  2. 创建ValidationRule
  3. 抛出例外
  4. 在性能,内存泄漏,代码可维护性和重用方面。

3 个答案:

答案 0 :(得分:22)

这是一种复杂的请求,老实说它可能会根据偏好而不是其他任何因素而变化。但是,这是我的理解:

  • 效果:除非您的其他实施方式非常糟糕,否则异常几乎每次都会丢失。抛出/捕获循环有很大的开销。 (轶事:我有一个'必须是一个数字'检查,这是一个例外,当它失败时,它“滞后”UI显着的时间,但当转换为ValidationRule时,它实际上是即时的。)
  • 内存泄漏:这取决于验证规则或IDataErrorInfo实现的完成方式。
  • 代码可维护性,重用:当然,这是有趣的部分。您真正应该问的是“何时使用ValidationRule代替IDataErrorInfo,反之亦然?”

ValidationRules比IDataErrorInfo早(我相信后者是在.Net 3.5中引入的)。仅基于此,似乎WPF团队更喜欢IDataErrorInfo。但事实是,它们是为不同的事物而建造的。如果您有MVVM或等效模式,则IDataErrorInfo优于模型中的错误(例如,负面年龄),而ValidationRules优于视图中的错误(比如说,an)的年龄。当然可以让ValidationRules执行“业务逻辑”检查,或让IDataErrorInfo告诉你“unicode snowman不是一个有效的年龄”,但是你可能(可能)通过保持这种模式获得最佳的可维护性。

但是,除了初始测试之外,不要使用异常进行验证,以确定您应该测试的确切条件。

答案 1 :(得分:6)

使用异常进行错误处理并不是一个好主意。使用异常会降低性能。这是选择和实现IDataErrorInfo或创建ValidationRule的问题。

<强> IDataErrorInfo的

  • 验证逻辑保持在视图模型中,易于实施和维护
  • 完全控制viewmodel中的所有字段

验证规则

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

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

答案 2 :(得分:3)

与其他两个答案中提出的观点相比,我对该主题的看法略有不同:

ValidationRule

  • 这适用于在更新绑定源之前需要进行的验证。您可能要执行此操作的原因包括能够向用户显示特定的错误消息,尤其是与数据转换之前的值相关的消息,或验证必须转换的数据。

  • 如其他答案中所述,在多个控件之间共享验证也更容易一些,因为您可以执行诸如创建用于多个绑定的单个ValidationRule或使用{{1 }},以提供一个BindingGroup,它可以一次检查多个绑定。

IDataErrorInfo INotifyDataErrorInfo

  • 这会将验证放入视图模型,适用于允许在视图模型中存储非法值的情况。可以通过此界面向用户提供特定的错误消息。

  • 验证可用于视图模型实现的任何客户端,从而为此类验证提供更好的重用性。

  • 重用验证规则不太方便,但绝不是不可能的。您只需要实现自己的辅助方法或对象即可根据需要执行验证。

例外

  • 其他答案基于性能问题避开了验证例外。但是,根据我的经验,UI场景中的异常处理通常很好。尽管异常处理会产生额外的开销,但它的发生速度仍然比用户注意到的要快(尽管未经验证的“注释”)。

  • 异常的一个重要方面是,它为您提供了在视图模型上实现错误通知接口的许多好处,同时仍可以防止在视图模型属性上设置无效值。换句话说,您可能有ValidationRule发生得太早而ValidationRule发生得太晚的验证场景。属性设置者抛出异常将解决这些情况。

底线:每种验证技术都有其自身的优缺点,并且适用于特定情况。没有一个可以比其他任何一个都优越。这很大程度上取决于您要执行哪种验证,以及您希望在何处看到该逻辑。