c# - 为什么 ValidateValueCallback 被调用了两次?

标签 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 的第二次调用从何而来?

最佳答案

我可以确认这种行为。注册依赖属性后,WPF 的内部调用验证回调。 一个调用总是发生,无论传递的元数据如何。 仅当通过元数据传递默认值时才会发生第二次调用

本来我以为第一次调用是因为WPF内部初始化,所以一直是类型的默认值。不是这种情况! 在第一次调用中传递的对象要么是类型的默认值,要么是元数据中指定的默认值。第二次调用似乎更合乎逻辑,只是传递了默认值。

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

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

Relevant (unanswered) question在 msdn 上。

关于c# - 为什么 ValidateValueCallback 被调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801088/

相关文章:

c# - Windows Phone 7 ResponseCallback 跨线程访问问题

C# 赢。表格 - 如何从 "System Summary"获取 "msinfo32"

c# - C#:有关引发适当类型的异常的文章

c# - 如何在 C# 中通过 snmp 获取打印机型号?

c# - 在基于 .Net 4.6 的 Web Api 2 中使用 System.IdentityModel.Tokens.Jwt 5.0.0.127 的异常

c# - 要求基类的子级从基类调用方法的设计模式

.net - 找不到资源词典

c# - 最大化/最小化外部应用程序

c# - 可以显示来自资源 URI 属性的 .png 和基于矢量的图像的 MenuItem

c# - WPF 文档查看器 : Navigate using internal link not accurate on first click