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
Concepts
Vue d'ensemble des propriétés de dépendance
Propriétés de dépendance personnalisées