Procedura: Eseguire l'override dei metadati per una proprietà di dipendenza

Questo esempio illustra come eseguire l'override dei metadati delle proprietà di dipendenza predefiniti provenienti da una classe ereditata chiamando il OverrideMetadata metodo e fornendo metadati specifici del tipo.

Esempio

Definendo il relativo PropertyMetadata, una classe può definire i comportamenti della proprietà di dipendenza, ad esempio il valore predefinito e i callback del sistema di proprietà. Molte classi della proprietà di dipendenza dispongono già di metadati predefiniti stabiliti nell'ambito del processo di registrazione. Sono incluse le proprietà di dipendenza che fanno parte dell'API WPF. Una classe che eredita la proprietà di dipendenza tramite l'ereditarietà di classe può eseguire l'override dei metadati originali in modo che le caratteristiche della proprietà che è possibile modificare tramite i metadati soddisfino qualsiasi requisito specifico della sottoclasse.

L'override dei metadati di una proprietà di dipendenza deve essere eseguito prima che la proprietà venga resa utilizzabile dal sistema di proprietà, vale a dire nel momento in cui vengono create istanze specifiche degli oggetti che registrano la proprietà. Le chiamate a OverrideMetadata devono essere eseguite all'interno dei costruttori statici del tipo che fornisce se stesso come forType parametro di OverrideMetadata. Il tentativo di modificare i metadati dopo la creazione delle istanze del tipo di proprietario non genererà eccezioni, ma darà come risultato comportamenti incoerenti nel sistema di proprietà. Inoltre, l'override dei metadati può essere eseguito solo una volta per tipo. I tentativi successivi di eseguire l'override dei metadati sullo stesso tipo genereranno un'eccezione.

Nell'esempio seguente la classe personalizzata MyAdvancedStateControl esegue l'override dei metadati forniti per StateProperty da MyStateControl con i nuovi metadati delle proprietà. Ad esempio, il valore predefinito di StateProperty sarà true quando viene eseguita una query sulla proprietà in un'istanza MyAdvancedStateControl appena creata.

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

Vedi anche