8

我知道它CoerceValueCallback用于更正一个值,ValidateValueCallback它将返回真或假。但我的问题是我们为什么需要ValidatevalueCallback?我们可以简单地使用CoerceValueCallback来验证(使用 if 条件)并更正值。您能否举一些实际示例说明何时使用强制与验证?

4

2 回答 2

16

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

使用CoerceValueCallback如果...

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

使用ValidateValueCallback如果...

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

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

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

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

示例 1

假设您有Minimum, Maximum, &Value属性。当其中任何一个发生变化时,CoerceValueCallback应该使用 a 来确保其他属性是一致的。
也就是说,Minmum<= Value<= Maximum

但是,假设这些值是双精度值,那么有些值永远不会有意义,即Double.NaNDouble.PositiveInfinityDouble.NegativeInfinity。因此,ValidateValueCallback应该使用 a 来验证双精度值是否为正常的数值。

事实上,这正是它的RangeBase工作原理!

示例 2

假设您有一个RegexTextBox控件,它接受一个包含正则表达式的字符串(调用它RegexString)。如果提供了错误的正则表达式,那么应该使用什么来代替?将其强制为空/空值可能是有意义的,使其无用;但是,我建议使用ValidateValueCallback. 这是因为在通过 WPF 设计器进行设计时,现在会在编译时引发任何错误。

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


有很多信息描述了如何使用这些回调。我建议查看 MSDN 文章Dependency Property Callbacks and Validation以获得更深入的知识。

于 2015-11-05T16:40:50.667 回答
8

值强制基本上是改变值,如果新值不符合系统预期。一个最好的例子是滑块控件。Slider 具有 Minimum 和 Maximum 属性。显然,如果允许最大值低于最小值,那将是一个问题。值强制用于防止出现这种无效状态。

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

无论如何,这两个回调都是可选的,可以根据需要使用。

于 2013-06-26T04:24:25.800 回答