Sdílet prostřednictvím


Předefinová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 metody OverrideMetadata. Přepsání metadat umožňuje upravit charakteristiky zděděné vlastnosti závislosti, aby vyhovovaly potřebám podtřídy.

Pozadí

Třída, která definuje vlastnost závislosti může určit jeho vlastnosti v PropertyMetadata nebo jeden 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í objekt PropertyMetadata 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, to musí provést před tím, než je vlastnost použita systémem vlastností. Závislá vlastnost je používána, když je instanciována jakákoli instance třídy, která tuto vlastnost registruje. Pro splnění tohoto požadavku by odvozená třída měla volat OverrideMetadata v rámci její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í. Také, odvozený typ nemůže přepsat metadata vlastnosti závislostí více než jednou, a pokud se o to pokusí, 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 je AffectsRender. Odvozená třída nepřepíše zděděný příznak AffectsRender, ale aktualizuje výchozí hodnotu AquariumGraphic u 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é