14 Stimmen

Wie kann ich einem bestehenden Abhängigkeits-Eigenschafts-Callback Logik hinzufügen?

Ich versuche, einen PropertyChangedCallback zu UIElement.RenderTransformOriginProperty hinzuzufügen. Eine Ausnahme wird ausgelöst, wenn ich versuche, die PropertyMetadata zu überschreiben.

Ich habe MSDN und Google durchsucht, und alles, was ich gefunden habe, ist cette . DependencyPropertyDescriptor.AddValueChanged wird an irgendeiner Stelle in diesem Beitrag vorgeschlagen, aber das wird nicht mein Problem lösen, da dies nicht eine pro-Instanz-Callback ist.

Ich verstehe nicht, was diese Ausnahme überhaupt bedeutet. Weiß jemand, was ich falsch mache?

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);
    }
}

27voto

Igor Zevaka Punkte 71448

WPF wird die Eigenschaft Metadaten für Sie zusammenführen, wenn Sie OverrideMetadata aufrufen, ohne dass Sie das ursprüngliche Metadatenobjekt übergeben müssen. Alles, was Sie tun müssen, ist also

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

Es ist zu beachten, dass der obige Code manchmal eine Ausnahme auslöst. Die beiden Fälle, in denen das passiert, sind

1. Die ursprünglichen Metadaten sind eine Unterklasse von PropertyMetadata - ich habe FrameworkPropertyMetadata und UIPropertyMetadata gesehen. Sie müssen nur die jeweils passende Klasse verwenden.

2. Die Abhängigkeitseigenschaft ist schreibgeschützt, und Sie können nichts dagegen tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X