首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDataErrorInfo与ValidationRule对异常

IDataErrorInfo与ValidationRule对异常
EN

Stack Overflow用户
提问于 2010-06-05 15:03:50
回答 4查看 7K关注 0票数 24

有人能告诉我在WPF中哪种方法是更好的验证方法吗?

实现IDataErrorInfo

  • Creating ValidationRule

  • Throwing异常的

在性能方面,内存泄漏、代码可维护性和重用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-06 00:27:13

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

除非您的其他实现是可怕的,否则

  • Performance:异常几乎每次都会丢失。投球/接球周期的开销很大。(轶事:我有一个‘必须是一个数字’的检查-这是一个例外,它在UI失败时“延迟”了一个明显的时间,但当转换为一个instant.)
  • Memory Leads:这取决于您的验证规则或IDataErrorInfo实现如何是done.
  • Code可维护性,重用:这当然是有趣的部分。您真正应该问的是“何时使用ValidationRule而不是IDataErrorInfo是合适的,反之亦然?”

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

但是,在初始测试之后,不要使用异常进行验证,以查看您应该测试的确切条件。

票数 28
EN

Stack Overflow用户

发布于 2013-09-30 03:42:28

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

IDataErrorInfo

  • 验证逻辑保持视图模型,易于实现和维护
  • 对视图模型

中所有字段的完全控制。

验证规则

  • 在单独的类
  • 中维护验证规则,提高了可重用性。例如,您可以实现所需的字段验证类,在整个application.

中重用它。

我的观点是,对于常见的验证,如所需的字段验证,电子邮件地址验证,您可以使用验证规则。如果您需要进行诸如范围验证之类的自定义验证,或者使用IDataerrorinfo进行任何自定义验证。

票数 8
EN

Stack Overflow用户

发布于 2020-04-20 06:04:01

我对这一主题的看法与其他两种回答中提出的观点略有不同:

ValidationRule

  • --这适用于在更新绑定源之前需要完成的验证。您可能希望这样做的原因包括:能够向用户提供特定的错误消息,特别是数据转换前与值相关的消息,或者验证必须转换的数据。正如其他答案所指出的,
  • 在多个控件之间共享验证也比较容易,因为您可以创建一个用于多个绑定的单一ValidationRule,或者使用BindingGroup提供一个单独的ValidationRule,该ValidationRule一次检查多个绑定。

IDataErrorInfoINotifyDataErrorInfo

  • 将验证放入视图模型,并适用于允许将非法值存储在视图模型中的场景。可以通过此interface.
  • Validation为视图模型实现的任何客户端提供特定的错误消息,为这种验证规则的validation.
  • Reuse提供更好的重用有点不方便,但绝不是不可能的。您只需要实现您自己的助手方法或对象就可以执行您喜欢的验证。

例外

基于性能考虑,

  • 其他答案避免了验证的异常。然而,我的经验是,UI场景中的异常处理通常都很好。尽管异常处理有额外的开销,但它的发生速度仍然远远超过用户所能注意到的速度(未经验证的“轶事”notwithstanding).
  • One异常的重要方面是,它为您在视图模型上实现错误通知接口提供了很大的好处,同时仍然防止在视图模型属性上设置无效的值。换句话说,您可能有一些验证场景,其中ValidationRule发生得太早,IDataErrorInfo发生得太晚。抛出属性设置程序的异常将解决这些情况。

底线:每种验证技术都有自己的优缺点,适合于特定的场景。没有一个比其他任何一个都优越。这在很大程度上取决于您要做的是什么类型的验证,以及希望在哪里执行该逻辑。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2980853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档