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.PositiveInfinity和Double.NegativeInfinity.因此,ValidateValueCallback应该使用a来验证double值是否正常,数值.
实际上,这正是如何RangeBase运作的!
例2
假设你有一个RegexTextBox控件,它接受一个包含正则表达式的字符串(调用它RegexString).如果提供了错误的正则表达式,那么应该使用什么呢?将它强制为null/empty值可能是有意义的,使其无用; 但是,我建议用a验证这个属性ValidateValueCallback.这是因为在通过WPF设计器进行设计时,编译时会抛出任何错误.
对于这个属性,根本不应该有CoerceValueCallback.
如果新值不符合系统预期,则值强制基本上是更改值。最好的示例是Slider控件。滑块具有最小和最大属性。显然,如果允许最大值降至最小值以下将是一个问题。值强制用于防止发生这种无效状态。
验证值是系统只会检查给定输入是否有效的值。如果value无效(如果我们为该值返回false),它将抛出Argument Exception。例如,我们具有Age属性,并且它的范围应该在0到120之间。如果新值是500,则系统可能会警告用户,而不是将其强制为某个硬编码值。
两种回调都是可选的,可以根据需要使用。