Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ValidateValueCallback调用了两次?_C#_.net_Wpf_Dependency Properties - Fatal编程技术网

C# 为什么ValidateValueCallback调用了两次?

C# 为什么ValidateValueCallback调用了两次?,c#,.net,wpf,dependency-properties,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 Ord

假设我有以下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
被调用了两次,而
oncorcevaluecallback
根本没有被调用。根据我所看到的,我猜当我创建实例时,WPF将调用
OnValidateValueCallBack
来检查默认值是否有效,如果有效,它将使用默认值,并且根本不会调用
impresseValueCallback
,那么
OnValidateValueCallBack
的第二个调用来自哪里

我可以证实这种行为。注册依赖项属性后,WPF的内部将调用validate回调无论传递的元数据如何,始终会发生一次调用第二次调用仅在通过元数据传递默认值时发生

最初我认为第一个调用是由于WPF的内部初始化,因此它始终是该类型的默认值。事实并非如此在第一次调用中传递的对象要么是类型的默认值,要么是元数据中指定的默认值。第二个调用似乎更符合逻辑,只传递默认值

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

第一个电话的用途对我来说是个谜


在msdn上。

设置断点并使用堆栈跟踪。