Freigeben über


Anleitung zum Überschreiben von Metadaten einer Abhängigkeitseigenschaft (WPF .NET)

Wenn Sie von einer Klasse abgeleitet werden, die eine Abhängigkeitseigenschaft definiert, erben Sie die Abhängigkeitseigenschaft und deren Metadaten. In diesem Artikel wird beschrieben, wie Sie die Metadaten einer geerbten Abhängigkeitseigenschaft überschreiben können, indem Sie die OverrideMetadata-Methode aufrufen. Durch das Überschreiben der Metadaten können Sie die Merkmale der geerbten Abhängigkeitseigenschaft so ändern, dass sie den unterklassenspezifischen Anforderungen entsprechen.

Hintergrund

Eine Klasse, die eine Abhängigkeitseigenschaft definiert, kann ihre Merkmale in PropertyMetadata oder einem der abgeleiteten Typen angeben, z. B. FrameworkPropertyMetadata. Eines dieser Merkmale ist der Standardwert einer Abhängigkeitseigenschaft. Viele Klassen, die Abhängigkeitseigenschaften definieren, geben Eigenschaftenmetadaten während der Registrierung von Abhängigkeitseigenschaften an. Wenn metadaten während der Registrierung nicht angegeben werden, weist das WPF-Eigenschaftensystem ein PropertyMetadata Objekt mit Standardwerten zu. Abgeleitete Klassen, die Abhängigkeitseigenschaften über die Klassenvererbung erben, haben die Möglichkeit, die ursprünglichen Metadaten einer Abhängigkeitseigenschaft außer Kraft zu setzen. Auf diese Weise können abgeleitete Klassen die Merkmale von Abhängigkeitseigenschaften selektiv ändern, um die Klassenanforderungen zu erfüllen. Beim Aufrufen OverrideMetadata(Type, PropertyMetadata)gibt eine abgeleitete Klasse einen eigenen Typ als ersten Parameter und eine Metadateninstanz als zweiten Parameter an.

Eine abgeleitete Klasse, die Metadaten für eine Abhängigkeitseigenschaft überschreibt, muss dies tun, bevor die Eigenschaft vom Eigenschaftensystem verwendet wird. Eine Abhängigkeitseigenschaft wird verwendet, wenn eine Instanz der Klasse, die die Eigenschaft registriert, instanziiert wird. Um diese Anforderung zu erfüllen, sollte die abgeleitete Klasse die Methode OverrideMetadata innerhalb ihres statischen Konstruktors aufrufen. Das Überschreiben der Metadaten einer Abhängigkeitseigenschaft, nachdem der Besitzertyp instanziiert wurde, löst keine Ausnahmen aus, führt aber zu inkonsistenten Verhaltensweisen im Eigenschaftensystem. Außerdem kann ein abgeleiteter Typ die Metadaten einer Abhängigkeitseigenschaft nicht mehr als einmal außer Kraft setzen, und Versuche, dies zu tun, lösen eine Ausnahme aus.

Beispiel

Im folgenden Beispiel überschreibt die abgeleitete Klasse TropicalAquarium die Metadaten einer von der Basisklasse Aquariumgeerbten Abhängigkeitseigenschaft. Der Metadatentyp ist FrameworkPropertyMetadata, der UI-bezogene WPF-Frameworkeigenschaften wie AffectsRenderunterstützt. Die abgeleitete Klasse überschreibt das geerbte AffectsRender-Flag nicht, aber sie aktualisiert den Standardwert von AquariumGraphic bei Instanzen der abgeleiteten Klasse.

public class Aquarium : DependencyObject
{
    // Register a dependency property with the specified property name,
    // property type, owner type, and property metadata.
    public static readonly DependencyProperty AquariumGraphicProperty =
        DependencyProperty.Register(
          name: "AquariumGraphic",
          propertyType: typeof(Uri),
          ownerType: typeof(Aquarium),
          typeMetadata: new FrameworkPropertyMetadata(
              defaultValue: new Uri("http://www.contoso.com/aquarium-graphic.jpg"),
              flags: FrameworkPropertyMetadataOptions.AffectsRender)
        );

    // Declare a read-write CLR wrapper with get/set accessors.
    public Uri AquariumGraphic
    {
        get => (Uri)GetValue(AquariumGraphicProperty);
        set => SetValue(AquariumGraphicProperty, value);
    }
}
Public Class Aquarium
    Inherits DependencyObject

    ' Register a dependency property with the specified property name,
    ' property type, owner type, and property metadata.
    Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty =
        DependencyProperty.Register(
            name:="AquariumGraphic",
            propertyType:=GetType(Uri),
            ownerType:=GetType(Aquarium),
            typeMetadata:=New FrameworkPropertyMetadata(
                defaultValue:=New Uri("http://www.contoso.com/aquarium-graphic.jpg"),
                flags:=FrameworkPropertyMetadataOptions.AffectsRender))

    ' Declare a read-write CLR wrapper with get/set accessors.
    Public Property AquariumGraphic As Uri
        Get
            Return CType(GetValue(AquariumGraphicProperty), Uri)
        End Get
        Set
            SetValue(AquariumGraphicProperty, Value)
        End Set
    End Property

End Class
public class TropicalAquarium : Aquarium
{
    // Static constructor.
    static TropicalAquarium()
    {
        // Create a new metadata instance with a modified default value.
        FrameworkPropertyMetadata newPropertyMetadata = new(
            defaultValue: new Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg"));

        // Call OverrideMetadata on the dependency property identifier.
        // Pass in the type for which the new metadata will be applied
        // and the new metadata instance.
        AquariumGraphicProperty.OverrideMetadata(
            forType: typeof(TropicalAquarium),
            typeMetadata: newPropertyMetadata);
    }
}
Public Class TropicalAquarium
    Inherits Aquarium

    ' Static constructor.
    Shared Sub New()
        ' Create a new metadata instance with a modified default value.
        Dim newPropertyMetadata As New FrameworkPropertyMetadata(
            defaultValue:=New Uri("http://www.contoso.com/tropical-aquarium-graphic.jpg"))

        ' Call OverrideMetadata on the dependency property identifier.
        ' Pass in the type for which the new metadata will be applied
        ' and the new metadata instance.
        AquariumGraphicProperty.OverrideMetadata(
            forType:=GetType(TropicalAquarium),
            typeMetadata:=newPropertyMetadata)
    End Sub

End Class

Siehe auch