Qu'est-ce qu'une propriété de dépendance?

136

Qu'est-ce qu'une propriété de dépendance dans .Net (en particulier dans le contexte WPF). Quelle est la différence avec la propriété ordinaire?

e11s
la source

Réponses:

94

Les propriétés de dépendance sont des propriétés de classes qui dérivent de DependencyObject, et elles sont spéciales en ce sens qu'au lieu d'utiliser simplement un champ de sauvegarde pour stocker leur valeur, elles utilisent certaines méthodes d'assistance sur DependencyObject.

La plus belle chose à leur sujet est qu'ils ont toute la plomberie pour la liaison de données intégrée. Si vous leur associez quelque chose, ils le notifieront quand ils changeront.

Matt Hamilton
la source
36
Cela me dit encore très peu de choses sur ce qu'une propriété de dépendance peut faire ou pourquoi elle existe. Vous ne mentionnez rien de leur propriété la plus précieuse, la résolution de valeur dans l'arborescence des éléments.
ProfK
salut @MattHamilton merci pour votre réponse - mais que voulez-vous dire par "ils utilisent des méthodes d'aide sur DependencyObject."?
BKSpurgeon
2
@BKSpurgeon DependencyObject a des méthodes comme "SetValue" et "GetValue" que vous appelez pour enregistrer / lire la valeur d'une propriété de dépendance, plutôt que d'utiliser un champ de sauvegarde.
Matt Hamilton
91

La seule explication que j'ai trouvée utile et bien écrite est celle-ci: http://www.wpftutorial.net/dependencyproperties.html

Fondamentalement, les DependencyProperties diffèrent des propriétés normales en ce qu'ils ne sont pas seulement des setters / getters pour les champs de la classe, mais ils récupèrent leurs valeurs réelles de manière dynamique pendant l'exécution. La SetValue()méthode des DP est assez simple et définit la valeur locale de la propriété sur la valeur que vous lui avez donnée. Cependant, lorsque vous essayez de GetValue()partir d'un DependencyProperty, il recherchera d'abord une valeur locale, si aucune n'est présente (ce qui est viable dans DependencyProperties contrairement aux propriétés régulières), il continuera dans l'arborescence logique de l'interface utilisateur jusqu'à ce qu'il trouve une telle valeur. Si le framework a atteint le sommet de l'arborescence sans trouver de valeurs locales, il utilisera alors une valeur par défaut prédéfinie comme valeur de la propriété.

Cette méthode permet à DependencyProperties de consommer moins de mémoire que les propriétés normales, car seules les valeurs explicitement définies par l'utilisateur seront stockées localement.

Et, comme mentionné ci-dessus, DependencyProperties nous permet également de nous lier à eux dans le code XAML et de définir des déclencheurs sur eux, ce qui n'est pas autorisé sur les propriétés normales.

J'espère avoir réussi à effacer une partie du flou :)

Jonathan Perry
la source
2
Et qu'est-ce qu'une "propriété attachée"?
Paul-Sebastian Manole
12
Une propriété attachée est une propriété qui n'appartient pas à l'élément actuel déclaré, mais qui affecte un autre objet. Par exemple: Grid.Row="1"sur a Button, définissez-le pour qu'il soit dans la ligne n ° 2 sur le parent Grid(en raison du fait que les lignes sont de base zéro) mais RowDependencyProperty appartient à l' Gridobjet.
Jonathan Perry
2
Lorsque vous avez dit DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed, vouliez-vous dire à la fois la liaison en XAML et la définition de déclencheurs ou simplement la définition de déclencheurs n'est pas autorisée. Merci pour le suivi et pour aider à rendre les choses plus claires!
Paul-Sebastian Manole
@ Paul-SebastianManole Les DataTriggers fonctionnent également sur les propriétés régulières. Supposons que vous ayez une Valuepropriété (pas DP) avec la valeur 0 et que vous souhaitiez que votre vue fasse quelque chose quand elle Valuepasse à 1. Vous pourrez le faire en utilisant DataTriggeret en définissant leBinding={Binding Path=Value, Value=1}
Jonathan Perry
36

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ fournit une bonne explication des propriétés de dépendance à la fois dans le contexte de WF et WPF.

Un extrait:

Point clé - La valeur des propriétés de dépendance est résolue

Le but ultime d'une propriété de dépendance, comme toute propriété, est de gérer l'état. Mais contrairement aux propriétés .Net normales, la valeur de la propriété locale n'est pas stockée dans une variable d'instance.

Au lieu de cela, les propriétés de dépendance sont enregistrées avec le cadre de propriété de dépendance et la valeur de propriété sous-jacente est résolue - ce qui signifie que la valeur est déterminée par le cadre de propriété de dépendance en fonction des règles définies par l'enregistrement de propriété.

Frêne M
la source