CoreceValueCallback和ValidateValueCallback之间的区别?

时间:2013-06-26 03:41:04

标签: wpf silverlight dependency-properties

我知道CoerceValueCallback用于更正值,ValidateValueCallback将返回true或false。但我的问题是为什么我们需要ValidatevalueCallback?我们可以简单地使用CoerceValueCallback来验证(使用if条件)并更正值。你能举出一些关于何时使用强制与验证的实际例子吗?

2 个答案:

答案 0 :(得分:9)

以下是我在使用强制与验证时遵循的规则。

使用CoerceValueCallback如果......

  • 您可以安全地将值更正为有效而无需抛出错误。
  • 您的属性取决于一个或多个其他依赖项属性。
  • 您需要提供实例级验证,而不是类级验证。
  • 您允许其他人覆盖您的验证逻辑。

使用ValidateValueCallback如果......

  • 您无法将值更正为有效。
  • 如果提供的值无效,则必须抛出错误。
  • 您不希望其他人覆盖您的验证逻辑。

因此,它主要取决于您的属性是否依赖于其他依赖项属性,或者您是否希望其他属性能够覆盖您的验证逻辑。

由于ValidateValueCallback不是PropertyMetadata的一部分,因此继承者无法通过DependencyProperty.OverrideMetadata函数修改回调。

此外,由于ValidateValueCallback未将DependencyObject作为参数提供,因此您无法执行依赖于其他依赖项属性的高级验证。

示例1

假设您有MinimumMaximum和& Value属性。当其中任何一项发生变化时,应使用CoerceValueCallback来确保其他属性一致。
即,Minmum< = Value< = {{1} }。

但是,假设这些值是双倍的,那么有些值永远不会有意义,即MaximumDouble.NaNDouble.PositiveInfinity。因此,应使用Double.NegativeInfinity来验证double值是否为正常的数值。

事实上,这正是RangeBase的作用!

示例2

假设你有一个ValidateValueCallback控件,它接受一个包含正则表达式的字符串(称之为RegexTextBox)。如果提供了错误的正则表达式,那么应该使用什么呢?将它强制为null / empty值可能是有意义的,使其无用;但是,我建议使用RegexString验证此属性。这是因为在通过WPF设计器进行设计时,现在在编译时抛出任何错误。

对于这个属性,根本不应该是ValidateValueCallback

<小时/> 有很多信息描述了如何使用这些回调。 我建议您查看MSDN文章Dependency Property Callbacks and Validation,了解更深入的知识。

答案 1 :(得分:4)

价值强制基本上是改变价值,如果新价值不如系统预期的那样。最好的例子是Slider控件。 Slider具有最小和最大属性。显然,如果允许最大值低于最小值,那将是一个问题。值强制用于防止发生此无效状态。

验证值,系统只检查给定输入是否有效。如果值无效,它将抛出Argument Exception(如果我们为这样的值返回false)。例如,我们有Age属性,它应该在0到120的范围内。如果新值为500,系统可能会警告用户,而不是将其强制转换为某个硬编码值。

任何方式两种回调都是可选的,可以根据要求使用。