Bağımlılık özelliği için meta verileri geçersiz kılma (WPF .NET)

Bağımlılık özelliğini tanımlayan bir sınıftan türetdiğinizde, bağımlılık özelliğini ve meta verilerini devralırsınız. Bu makalede, yöntemini çağırarak OverrideMetadata devralınan bir bağımlılık özelliğinin meta verilerini nasıl geçersiz kılabileceğiniz açıklanır. Meta verileri geçersiz kılma, devralınan bağımlılık özelliğinin özelliklerini alt sınıfa özgü gereksinimlerle eşleşecek şekilde değiştirmenize olanak tanır.

Background

Bağımlılık özelliğini tanımlayan bir sınıf veya gibi FrameworkPropertyMetadatatüretilmiş türlerinden birinde özelliklerini PropertyMetadata belirtebilir. Bu özelliklerden biri, bağımlılık özelliğinin varsayılan değeridir. Bağımlılık özelliklerini tanımlayan birçok sınıf, bağımlılık özelliği kaydı sırasında özellik meta verilerini belirtir. Kayıt sırasında meta veriler belirtilmediğinde WPF özellik sistemi varsayılan değerlerle bir PropertyMetadata nesne atar. Sınıf devralma aracılığıyla bağımlılık özelliklerini devralan türetilmiş sınıflar, herhangi bir bağımlılık özelliğinin özgün meta verilerini geçersiz kılma seçeneğine sahiptir. Bu şekilde, türetilmiş sınıflar sınıf gereksinimlerini karşılamak için bağımlılık özelliği özelliklerini seçmeli olarak değiştirebilir. çağrılırken OverrideMetadata(Type, PropertyMetadata), türetilmiş bir sınıf ilk parametre olarak kendi türünü ve ikinci parametre olarak bir meta veri örneğini belirtir.

Bir bağımlılık özelliğindeki meta verileri geçersiz kılan türetilmiş bir sınıf, özelliği özellik sistemi tarafından kullanılmaya yerleştirilmeden önce bunu yapmalıdır. Bir bağımlılık özelliği, özelliği kaydeden sınıfın herhangi bir örneği örneklendiğinde kullanılır. Bu gereksinimi karşılamaya yardımcı olmak için türetilmiş sınıfın statik oluşturucusunun içinde çağrısı OverrideMetadata yapması gerekir. Sahip türü örneği eklendikten sonra bağımlılık özelliğinin meta verilerinin geçersiz kılınması özel durum oluşturmaz, ancak özellik sisteminde tutarsız davranışlara neden olur. Ayrıca, türetilmiş bir tür bir bağımlılık özelliğinin meta verilerini birden çok kez geçersiz kılamaz ve bunu yapmayı denerse bir özel durum oluşur.

Örnek

Aşağıdaki örnekte, türetilmiş sınıf, temel Aquariumsınıfından TropicalAquarium devralınan bir bağımlılık özelliğinin meta verilerini geçersiz kılar. Meta veri türü, gibi AffectsRenderUI ile ilgili WPF çerçevesi özelliklerini destekleyen şeklindedirFrameworkPropertyMetadata. Türetilmiş sınıf devralınan AffectsRender bayrağı geçersiz kılmaz, ancak türetilmiş sınıf örneklerinde varsayılan değerini AquariumGraphic güncelleştirir.

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

Ayrıca bkz.