Почему ValidateValueCallback вызывается дважды? - PullRequest
2 голосов
/ 27 сентября 2010

Предположим, у меня следующий тип 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 Ответ

1 голос
/ 16 мая 2011

Я могу подтвердить это поведение. После регистрации свойства зависимости, обратный вызов validate вызывается внутренними компонентами WPF. Один вызов всегда происходит , независимо от переданных метаданных. Второй вызов происходит только тогда, когда значение по умолчанию передается с метаданными.

Первоначально я думал, что первый вызов произошел из-за внутренней инициализации WPF, поэтому он всегда будет значением по умолчанию для типа. Это не вариант! Объект, переданный в первом вызове, является либо значением по умолчанию типа, либо значением по умолчанию, которое указано в метаданных . Второй вызов кажется более логичным и просто передает значение по умолчанию.

Никакие принудительные или измененные обратные вызовы не вызываются при регистрации.

Что такое использование первого звонка, для меня загадка.

Актуальный (без ответа) вопрос на MSDN.

...