Propriétés de dépendance et chargement XAML

L'implémentation WPF actuelle de son processeur XAML connaît de manière inhérente la propriété de dépendance. Le processeur WPF XAML utilise des méthodes de système de propriétés pour les propriétés de dépendance lors du chargement de XAML binaire et du traitement des attributs correspondant à des propriétés de dépendance. Cette fonctionnalité ignore efficacement les wrappers de propriété. Lorsque vous implémentez des propriétés de dépendance personnalisées, vous devez tenir compte de ce comportement et vous devez éviter de placer dans votre wrapper de propriété tout code autre que les méthodes de système de propriétés GetValue et SetValue.

Cette rubrique comprend les sections suivantes.

  • Composants requis
  • Performance et implémentation du chargeur XAML WPF
  • Implications pour les propriétés de dépendance personnalisées
  • Rubriques connexes

Composants requis

Cette rubrique suppose que vous compreniez les propriétés de dépendance aussi bien comme consommateur que comme auteur et que vous ayez lu Vue d'ensemble des propriétés de dépendance et Propriétés de dépendance personnalisées. Vous devez également avoir lu Vue d'ensemble du langage XAML (WPF) et Syntaxe XAML en détail.

Performance et implémentation du chargeur XAML WPF

Pour des raisons d'implémentation, il revient mois cher, en termes de calculs, d'identifier une propriété comme une propriété de dépendance et d'accéder à la méthode de système de propriétés SetValue pour la définir, plutôt que d'utiliser le wrapper de propriété et son accesseur Set. Cela est dû au fait qu'un processeur XAML doit déduire l'intégralité du modèle objet du code de stockage uniquement sur la base de la connaissance du type et des relations entre les membres indiqués par la structure du balisage et différentes chaînes.

Le type est recherché dans une combinaison d'attributs xmlns et d'assembly, mais l'identification des membres, la détermination de ceux qui accepteraient d'être définis comme attribut et la résolution des types pris en charge par les valeurs de propriété nécessiteraient sinon une grande réflexion à l'aide de PropertyInfo. Du fait que les propriétés de dépendance sur un type donné sont accessibles comme une table de stockage dans le système de propriétés, l'implémentation WPF de son processeur XAML utilise cette table et déduit que toute propriété ABC donnée peut être définie plus efficacement en appelant SetValue sur le type dérivé DependencyObject contenant, en utilisant l'identificateur de propriété de dépendance ABCProperty.

Implications pour les propriétés de dépendance personnalisées

Du fait que l'implémentation WPF actuelle du comportement du processeur XAML pour le paramètre de propriété ignore l'intégralité des wrappers, vous ne devez placer aucune logique supplémentaire dans les définitions du wrapper de votre propriété de dépendance personnalisée. Si vous passez outre cette recommandation, la logique ne sera alors pas exécutée lorsque la propriété est définie en XAML plutôt que dans le code.

De la même façon, d'autres aspects du processeur XAML qui obtiennent des valeurs de propriété du traitement XAML utilisent également GetValue plutôt que le wrapper. Par conséquent, vous devez également éviter toute implémentation supplémentaire dans la définition get au-delà de l'appel de GetValue.

L'exemple suivant illustre une définition de propriété de dépendance recommandée avec les wrappers, où l'identificateur de propriété est stocké comme un champ public static readonly, et les définitions get et set ne contiennent aucun code au-delà des méthodes de système de propriétés nécessaires qui définissent le stockage de la propriété de dépendance.


Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Voir aussi

Concepts

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

Vue d'ensemble du langage XAML (WPF)

Métadonnées de propriété de dépendance

Propriétés de dépendance de type collection

Sécurité de propriété de dépendance

Modèles de constructeur sécurisé pour DependencyObjects