Partager via


Comment : substituer les métadonnées d'une propriété de dépendance

Cet exemple montre comment remplacer des métadonnées de propriété de dépendance par défaut héritées d'une classe en appelant la méthode OverrideMetadata et en fournissant des métadonnées de type.

Exemple

En définissant ses PropertyMetadata, une classe peut définir les comportements de la propriété de dépendance , tels que sa valeur par défaut et ses rappels de système de propriétés. Un grand nombre de classes de propriété de dépendance disposent de métadonnées par défaut définies dans le cadre de leur processus d'inscription. Cela inclut les propriétés de dépendance qui font partie de WPFAPI. Une classe qui hérite de la propriété de dépendance via son héritage de classe peut remplacer les métadonnées d'origine pour que les caractéristiques de la propriété qui peut être altérée à travers des métadonnées réponde aux conditions de sous-classe.

Le remplacement des métadonnées dans une propriété de dépendance doit être effectué avant que la propriété soit placée pour être utilisée par le système de propriétés (cela correspond au moment où des instances spécifiques des objets qui inscrivent la propriété sont instanciées). Les appels à OverrideMetadata doivent être effectués dans les constructeurs statiques du type qui correspond lui-même au paramètre forType de OverrideMetadata. Si vous essayez de modifier les métadonnées lorsque les instances du type propriétaire existent , vous ne levez pas d'exception, mais vous générez des comportements incohérents dans le système de propriétés. En outre, les métadonnées peuvent être remplacées une seule fois par type. Toute nouvelle tentative de remplacement des métadonnées dans le même type lève une exception.

Dans l'exemple suivant, la classe personnalisée MyAdvancedStateControl remplace les métadonnées fournies pour StateProperty par MyAdvancedStateControl par de nouvelles métadonnées de propriété. Par exemple, la valeur par défaut de la StateProperty est maintenant true lorsque la propriété est interrogée dans une nouvelle instance MyAdvancedStateControl construite.

  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));
  }
}

Voir aussi

Référence

DependencyProperty

Concepts

Vue d'ensemble des propriétés de dépendance

Propriétés de dépendance personnalisées

Autres ressources

Rubriques "Comment" relatives aux propriétés