Sdílet prostřednictvím


Postupy: Přepsání metadat pro vlastnost závislosti

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

Příklad

Definováním PropertyMetadatamůže třída 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ž tuto vlastnost začne používat systém vlastností (tj. před vytvořením konkrétních instancí objektů, které již registrují tuto vlastnost). Volání OverrideMetadata musí být provedena v rámci statických konstruktorů typu, který sám poskytuje jako forType parametr OverrideMetadata. Pokud se pokusíte změnit metadata, pokud již existují instance typu vlastníka, nebude vyvolána výjimka, ale způsobí to 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á pro StatePropertyMyStateControl s novými metadaty vlastností. Například výchozí hodnota StateProperty je nyní true při dotazování vlastnosti na nově sestavenou instanci MyAdvancedStateControl.

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é