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 SetValue le type dérivé contenantDependencyObject, à l’aide de l’identificateur de propriété de dépendance ABCProperty.
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 public
static
readonly
champ, et les get
set
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
.NET Desktop feedback