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
.NET Desktop feedback