Partager via


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

L’implémentation WPF actuelle de son processeur XAML est intrinsèquement consciente de la propriété de dépendance. Le processeur XAML WPF utilise des méthodes de système de propriétés pour les propriétés de dépendance lors du chargement d’attributs XAML binaires et de traitement qui sont 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 éviter de placer tout autre code dans votre wrapper de propriétés autre que les méthodes GetValue du système de propriétés et SetValue.

Prérequis

Cette rubrique part du principe que vous savez ce que sont les propriétés de dépendance, comme consommateur et comme auteur, et que vous avez 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 le code XAML dans WPF et la syntaxe XAML en détail.

Performance et implémentation du chargeur XAML WPF

Pour des raisons d’implémentation, il est moins coûteux d’identifier une propriété comme propriété de dépendance et d’accéder à la méthode du système SetValue de propriétés pour le définir, plutôt que d’utiliser le wrapper de propriétés et son setter. Cela est dû au fait qu’un processeur XAML doit déduire l’intégralité du modèle objet du code de stockage en fonction de la connaissance des relations de type et de membre indiquées par la structure du balisage et de diverses chaînes.

Le type est recherché par le biais d’une combinaison d’attributs xmlns et d’assemblys, mais l’identification des membres, la détermination qui peut prendre en charge la définition en tant qu’attribut et la résolution des types pris en charge par les valeurs de propriété nécessite une réflexion approfondie à l’aide PropertyInfode . Étant donné que les propriétés de dépendance d’un type donné sont accessibles en tant que table de stockage via 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é donnée ABC peut être plus efficace en appelant le type dérivé contenantSetValue, à l’aide de l’identificateur DependencyObject.

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

Étant donné que l’implémentation WPF actuelle du comportement du processeur XAML pour le paramètre de propriété contourne entièrement les wrappers, vous ne devez pas placer de logique supplémentaire dans les définitions de jeu du wrapper pour votre propriété de dépendance personnalisée. Si vous placez cette logique dans la définition de jeu, la logique ne sera pas exécutée lorsque la propriété est définie en XAML plutôt que dans le code.

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

L’exemple suivant est une définition de propriété de dépendance recommandée avec des wrappers, où l’identificateur de propriété est stocké en tant que publicstaticreadonly champ, et les getset définitions ne contiennent pas de code au-delà des méthodes de système de propriétés nécessaires qui définissent le stockage des propriétés de dépendance.


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

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

Voir aussi