Condividi tramite


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

In questo esempio viene mostrato come eseguire l'override dei metadati delle proprietà di dipendenza predefiniti che provengono da una classe ereditata, chiamando il metodo OverrideMetadata e fornendo metadati specifici del tipo.

Esempio

Tramite la definizione del relativo oggetto PropertyMetadata, una classe può specificare 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 come parte del processo di registrazione. Sono incluse le proprietà di dipendenza che fanno parte delle 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à, ovvero 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 parametro forType 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 della proprietà. Inoltre, l'override di metadati può essere eseguito solo una volta per tipo. I successivi tentativi 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 MyAdvancedStateControl 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
      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
      Inherits MyStateControl
    Public Sub New()
        MyBase.New()
    End Sub
    Shared Sub New()
      MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
    End Sub
  End Class
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 MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}

Vedere anche

Riferimenti

DependencyProperty

Concetti

Cenni preliminari sulle proprietà di dipendenza

Proprietà Dependency personalizzate

Altre risorse

Procedure relative alle proprietà