Sdílet prostřednictvím


Přepsání metadat pro vlastnost závislosti (WPF .NET)

Při odvození z třídy, která definuje vlastnost závislosti, dědíte vlastnost závislosti a její metadata. Tento článek popisuje, jak můžete přepsat metadata zděděné vlastnosti závislosti voláním OverrideMetadata metody. Přepsání metadat umožňuje upravit vlastnosti zděděné vlastnosti závislosti tak, aby odpovídaly požadavkům specifickým pro podtřídu.

Důležité

Dokumentace k desktopové příručce pro .NET 7 a .NET 6 se právě připravuje.

Pozadí

Třída, která definuje vlastnost závislosti může určit jeho vlastnosti v PropertyMetadata nebo v jednom z jeho odvozených typů, například FrameworkPropertyMetadata. Jednou z těchto charakteristik je výchozí hodnota vlastnosti závislosti. Mnoho tříd, které definují vlastnosti závislosti, určují metadata vlastností během registrace vlastnosti závislosti. Pokud během registrace nejsou zadána metadata, systém vlastností WPF přiřadí PropertyMetadata objekt s výchozími hodnotami. Odvozené třídy, které dědí vlastnosti závislostí prostřednictvím dědičnosti tříd, mají možnost přepsat původní metadata jakékoli vlastnosti závislosti. Tímto způsobem mohou odvozené třídy selektivně upravit vlastnosti závislostí tak, aby splňovaly požadavky třídy. Při volání OverrideMetadata(Type, PropertyMetadata)určuje odvozená třída svůj vlastní typ jako první parametr a instance metadat jako druhý parametr.

Odvozená třída, která přepisuje metadata na vlastnosti závislosti musí provést, aby byla vlastnost umístěna v systému vlastností. Vlastnost závislosti se používá, pokud je vytvořena instance jakékoli instance třídy, která registruje vlastnost. Pro splnění tohoto požadavku by odvozená třída měla volat OverrideMetadata v rámci svého statického konstruktoru. Přepsání metadat vlastnosti závislosti po vytvoření instance typu vlastníka nevyvolá výjimky, ale způsobí nekonzistentní chování v systému vlastností. Odvozený typ také nemůže přepsat metadata vlastnosti závislosti více než jednou a pokusí se to provést vyvolá výjimku.

Příklad

V následujícím příkladu odvozená třída TropicalAquarium přepíše metadata vlastnosti závislosti zděděné ze základní třídy Aquarium. Typ metadat je FrameworkPropertyMetadata, který podporuje vlastnosti rozhraní WPF související s uživatelským rozhraním, jako AffectsRenderje . Odvozená třída nepřepíše zděděný AffectsRender příznak, ale aktualizuje výchozí hodnotu AquariumGraphic odvozených instancí třídy.

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

Viz také