我知道CoerceValueCallback
用于更正值,ValidateValueCallback
将返回true或false。但我的问题是为什么我们需要ValidatevalueCallback
?我们可以简单地使用CoerceValueCallback
来验证(使用if条件)并更正值。你能举出一些关于何时使用强制与验证的实际例子吗?
答案 0 :(得分:9)
以下是我在使用强制与验证时遵循的规则。
使用CoerceValueCallback
如果......
使用ValidateValueCallback
如果......
因此,它主要取决于您的属性是否依赖于其他依赖项属性,或者您是否希望其他属性能够覆盖您的验证逻辑。
由于ValidateValueCallback
不是PropertyMetadata
的一部分,因此继承者无法通过DependencyProperty.OverrideMetadata
函数修改回调。
此外,由于ValidateValueCallback
未将DependencyObject
作为参数提供,因此您无法执行依赖于其他依赖项属性的高级验证。
示例1
假设您有Minimum
,Maximum
和& Value
属性。当其中任何一项发生变化时,应使用CoerceValueCallback
来确保其他属性一致。
即,Minmum
< = Value
< = {{1} }。
但是,假设这些值是双倍的,那么有些值永远不会有意义,即Maximum
,Double.NaN
和Double.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,系统可能会警告用户,而不是将其强制转换为某个硬编码值。
任何方式两种回调都是可选的,可以根据要求使用。