Jak zastąpić metadane dla właściwości zależności

W tym przykładzie pokazano, jak zastąpić domyślne metadane właściwości zależności pochodzące z dziedziczonej klasy przez wywołanie OverrideMetadata metody i podanie metadanych specyficznych dla typu.

Przykład

Definiując klasę PropertyMetadata, klasa może definiować zachowania właściwości zależności, takie jak jego wartość domyślna i wywołania zwrotne systemu właściwości. Wiele klas właściwości zależności ma już domyślne metadane ustanowione w ramach procesu rejestracji. Obejmuje to właściwości zależności, które są częścią interfejsu API WPF. Klasa, która dziedziczy właściwość zależności za pośrednictwem dziedziczenia klasy, może zastąpić oryginalne metadane, tak aby właściwości właściwości, które można zmienić za pomocą metadanych, będą zgodne z dowolnymi wymaganiami specyficznymi dla podklasy.

Zastępowanie metadanych właściwości zależności należy wykonać przed umieszczeniem tej właściwości w użyciu przez system właściwości (odpowiada to czasowi utworzenia wystąpienia określonych wystąpień obiektów rejestrujących właściwość). Wywołania do OverrideMetadata muszą być wykonywane w konstruktorach statycznych typu, który udostępnia się jako forType parametr .OverrideMetadata Jeśli spróbujesz zmienić metadane po wystąpieniu typu właściciela, nie będzie to zgłaszać wyjątków, ale spowoduje to niespójne zachowania w systemie właściwości. Ponadto metadane można przesłonić tylko raz na typ. Kolejne próby zastąpienia metadanych w tym samym typie spowodują wystąpienie wyjątku.

W poniższym przykładzie klasa MyAdvancedStateControl niestandardowa zastępuje metadane udostępniane StateProperty przez element za pomocą MyStateControl nowych metadanych właściwości. Na przykład wartość domyślna elementu StateProperty to teraz true , gdy właściwość jest odpytywane w nowo skonstruowanym MyAdvancedStateControl wystąpieniu.

public class MyStateControl : ButtonBase
{
  public MyStateControl() : base() { }
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); }
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
Public Class MyStateControl
    Inherits ButtonBase
  Public Sub New()
      MyBase.New()
  End Sub
  Public Property State() As Boolean
    Get
        Return CType(Me.GetValue(StateProperty), Boolean)
    End Get
    Set(ByVal value As Boolean)
        Me.SetValue(StateProperty, value)
    End Set
  End Property
  Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
End Class
public class MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}
Public Class MyAdvancedStateControl
    Inherits MyStateControl
  Public Sub New()
      MyBase.New()
  End Sub
  Shared Sub New()
    MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
  End Sub
End Class

Zobacz też