Sdílet prostřednictvím


Postupy: Přetížení metadat pro vlastnost závislosti

Tento příklad ukazuje, jak přepsat výchozí metadata vlastností závislostí pocházející z zděděné třídy voláním OverrideMetadata metody a poskytnutím metadat specifických pro typ.

Příklad

Definováním třídy PropertyMetadatamůže definovat chování vlastnosti závislosti, jako je výchozí hodnota a zpětné volání systému vlastností. Mnoho tříd vlastností závislostí již má výchozí metadata vytvořená v rámci procesu registrace. To zahrnuje vlastnosti závislosti, které jsou součástí rozhraní WPF API. Třída, která dědí vlastnost závislosti prostřednictvím dědičnosti třídy, může přepsat původní metadata tak, aby vlastnosti vlastnosti, které lze změnit prostřednictvím metadat, odpovídaly všem požadavkům specifických pro podtřídu.

Přepsání metadat vlastnosti závislosti musí být provedeno před tím, než se tato vlastnost použije systémem vlastností (to se rovná době, kdy se vytvoří instance konkrétních instancí objektů, které registrují vlastnost). Volání musí OverrideMetadata být provedena v rámci statických konstruktorů typu, který poskytuje sám jako forType parametr .OverrideMetadata Pokud se pokusíte změnit metadata, jakmile instance typu vlastníka existují, nevyvolá se výjimky, ale způsobí nekonzistentní chování v systému vlastností. Metadata je také možné přepsat pouze jednou pro každý typ. Při následných pokusech o přepsání metadat stejného typu dojde k výjimce.

V následujícím příkladu vlastní třída MyAdvancedStateControl přepíše metadata poskytnutá StatePropertyMyStateControl novými metadaty vlastností. Například výchozí hodnota objektu StateProperty je nyní true , když je vlastnost dotazována na nově sestavenou MyAdvancedStateControl instanci.

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

Viz také