为什么ValidateValueCallback被调用两次?

时间:2010-09-27 04:17:52

标签: c# .net wpf dependency-properties

假设我有以下DependencyObject类型,

public class Test : DependencyObject
{


    public int Order
    {
        get { return (int)GetValue(OrderProperty); }
        set { SetValue(OrderProperty, value); }
    }

    public static readonly DependencyProperty OrderProperty =
        DependencyProperty.Register("OrderProperty",
        typeof(int),
        typeof(Test),
        new FrameworkPropertyMetadata(6,
            new PropertyChangedCallback(OnOrderPropertyChanged),
            new CoerceValueCallback(OnCoerceValueCallBack)),
        new ValidateValueCallback(OnValidateValueCallBack));

    static void OnOrderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Console.WriteLine("OnOrderPropertyChanged");
    }

    static object OnCoerceValueCallBack(DependencyObject d, object baseValue)
    {
        Console.WriteLine("OnCoerceValueCallBack");
       return 200;
    }

    static bool OnValidateValueCallBack(object value)
    {
        Console.WriteLine("OnValidateValueCallBack");
        int iValue = (int)value;
        return iValue > 5;
    }
}

当我创建 Test 的实例时,我看到OnValidateValueCallBack被调用两次而OnCoerceValueCallBack根本没有被调用。基于我所看到的,我想当我创建实例时,WPF将调用OnValidateValueCallBack来检查默认值是否有效,如果是,它将使用默认值并且不会调用CoerceValueCallback那么,OnValidateValueCallBack的第二次召唤来自哪里?

1 个答案:

答案 0 :(得分:1)

我可以确认这种行为。注册依赖项属性后,WPF的内部调用验证回调。无论传递的元数据是什么,始终会发生一次通话第二次调用仅在使用元数据传递的默认值时发生。

最初我认为第一次调用是由于WPF的内部初始化,所以它始终是该类型的默认值。不是这种情况! 第一次调用中传递的对象是类型的默认值,或者是元数据中指定的默认值。第二个调用似乎更合乎逻辑,只是传递默认值。

注册时不会调用强制或更改的回调。

第一次通话的用途对我来说是一个谜。

在msdn上

Relevant (unanswered) question