代码之家  ›  专栏  ›  技术社区  ›  me.at.coding

DependencyProperty ValidateValueCallback问题

  •  8
  • me.at.coding  · 技术社区  · 14 年前

    我将validateValueCallback添加到名为A的DependencyProperty中。现在在validate回调中,A将与名为B的DependencyProperty的值进行比较。但是如何访问 静止的 validateValueCallback方法validateValue(对象值)?谢谢你的提示!

    样例代码:

    class ValidateTest : DependencyObject
    {
        public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(), validateValue);
        public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest));
    
    
        static bool validateValue(object value)
        {
            // Given value shall be greater than 0 and smaller than B - but how to access the value of B?
    
            return (double)value > 0 && value <= /* how to access the value of B ? */
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  15
  •   Abe Heidebrecht    14 年前

    验证回调用作针对一组静态约束对给定输入值的健全性检查。在验证回调中,检查正值是对验证的正确使用,但不检查其他属性。如果需要确保给定值小于从属属性,则应使用 property coercion ,像这样:

    public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(1.0, null, coerceValue), validateValue);
    public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest), new PropertyMetaData(bChanged));
    
    static object coerceValue(DependencyObject d, object value)
    {
        var bVal = (double)d.GetValue(BProperty);
    
        if ((double)value > bVal)
            return bVal;
    
        return value;
    }
    
    static bool validateValue(object value)
    {
        return (double)value > 0;
    }
    

    如果设置a>b(就像validationcallback一样),这不会引发异常,但实际上这是所需的行为。由于您不知道属性的设置顺序,因此应该支持按任意顺序设置属性。

    如果b的值发生变化,我们还需要告诉wpf强制属性a的值,因为强制值可能发生变化:

    static void bChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        d.CoerceValue(AProperty);
    }