Как я могу добавить логику к существующему обратному вызову свойства зависимости? - PullRequest
11 голосов
/ 21 августа 2009

Я пытаюсь добавить PropertyChangedCallback в UIElement.RenderTransformOriginProperty. Исключение выдается, когда я пытаюсь переопределить PropertyMetadata.

Я искал MSDN и Google, и все, что мне удалось найти, это this . DependencyPropertyDescriptor.AddValueChanged предлагается в какой-то момент в этом посте, но это не решит мою проблему, так как это не обратный вызов для каждого экземпляра.

Я вообще не понимаю, что означает это исключение. Кто-нибудь знает, что я делаю не так?

public class foo : FrameworkElement
{
    private static void Origin_Changed( DependencyObject d,
                                        DependencyPropertyChangedEventArgs e)
    { }

    static foo()
    {
        PropertyMetadata OriginalMetaData =
            UIElement.RenderTransformOriginProperty.GetMetadata(
                typeof(FrameworkElement));



/*An exception is thrown when this line is executed:
 "Cannot change property metadata after it has been associated with a property"*/
        OriginalMetaData.PropertyChangedCallback +=
            new PropertyChangedCallback(Origin_Changed);



        UIElement.RenderTransformOriginProperty.OverrideMetadata(
            typeof(foo), OriginalMetaData);
    }
}

1 Ответ

21 голосов
/ 21 августа 2009

WPF объединит метаданные свойства для вас при вызове OverrideMetadata, нет необходимости передавать ему исходный объект метаданных. Так что все, что вам нужно сделать, это

UIElement.RenderTransformOriginProperty.OverrideMetadata(typeof(foo), new PropertyMetadata(new PropertyChangedCallback(Origin_Changed)));

Следует помнить, что приведенный выше код вызывает исключение. Это происходит в двух случаях:

1. Исходные метаданные являются подклассом PropertyMetadata - я видел FrameworkPropertyMetadata и UIPropertyMetadata. Вы просто должны использовать соответствующий в каждом случае.

2. Свойство зависимостей доступно только для чтения, и вы ничего не можете с этим поделать.

...