Как добавить логику к существующему обратному вызову зависимостей?

Я пытаюсь добавить свойство 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

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

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

Одна вещь, о которой нужно знать, иногда код выше выдает исключение. В двух случаях, когда это происходит,

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

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