Partager via


Guide pratique pour substituer les métadonnées d'une propriété de dépendance

Cet exemple montre comment remplacer les métadonnées de propriété de dépendance par défaut provenant d’une classe héritée, en appelant la OverrideMetadata méthode et en fournissant des métadonnées spécifiques au type.

Exemple

En définissant son 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. De nombreuses classes de propriétés de dépendance ont déjà des 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 l’API WPF. Une classe qui hérite de la propriété de dépendance par l’intermédiaire de son héritage de classe peut substituer les métadonnées d’origine pour que les caractéristiques de la propriété qui peuvent être modifiées via des métadonnées respectent les exigences propres à la sous-classe.

La substitution des métadonnées sur une propriété de dépendance doit être effectuée avant que celle-ci soit mise en cours d’utilisation par le système de propriétés (cela équivaut au moment où des instances spécifiques d’objets qui inscrivent la propriété sont instanciées). Les appels à OverrideMetadata effectuer dans les constructeurs statiques du type qui se fournissent comme forType paramètre de OverrideMetadata. Si vous tentez de changer des métadonnées une fois qu’il existe des instances du type propriétaire, cela ne déclenche pas d’exceptions mais provoque des comportements incohérents dans le système de propriétés. En outre, les métadonnées ne peuvent être substituée qu’une seule fois par type. Toute tentative ultérieure de substitution des métadonnées sur 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 MyStateControl par de nouvelles métadonnées de propriété. Par exemple, la valeur par défaut de StateProperty est désormais true quand la propriété est interrogée sur une instance de MyAdvancedStateControl nouvellement construite.

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

Voir aussi