CoreceValueCallback和ValidateValueCallback之间的区别?

Rav*_*amy 5 silverlight wpf dependency-properties

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

Nic*_*ler 11

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

使用CoerceValueCallbackIf ...

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

使用ValidateValueCallbackIf ...

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

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

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

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

例1

假设你有Minimum,Maximum,和Value属性.当这些中的任何一个发生变化时,CoerceValueCallback应该使用它来确保其他属性是一致的.
也就是说,Minmum<= Value<= Maximum.

然而,假设这些值加倍,然后有一些价值,将永远是有意义的,即Double.NaN,Double.PositiveInfinityDouble.NegativeInfinity.因此,ValidateValueCallback应该使用a来验证double值是否正常,数值.

实际上,这正是如何RangeBase运作的!

例2

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

对于这个属性,根本不应该有CoerceValueCallback.


有很多信息描述了如何使用这些回调.我建议看看MSDN文章,依赖属性回调和验证,以获得更深入的知识.


Jaw*_*har 5

如果新值不符合系统预期,则值强制基本上是更改值。最好的示例是Slider控件。滑块具有最小和最大属性。显然,如果允许最大值降至最小值以下将是一个问题。值强制用于防止发生这种无效状态。

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

两种回调都是可选的,可以根据需要使用。