623 votes

Comment utilise-t-on les liaisons WPF avec RelativeSource ?

Comment utiliser `` avec liaisons WPF et quels sont les différents cas d’utilisation ?

818voto

Abe Heidebrecht Points 16417

Si vous souhaitez lier à une autre propriété sur l’objet :

Si vous souhaitez obtenir une propriété sur un ancêtre :

Si vous souhaitez obtenir une propriété sur le parent basé sur des modèles (que vous pouvez faire 2 liaisons moyen dans un ControlTemplate)

ou, plus courte (cela ne fonctionne que pour les liaisons OneWay) :

137voto

Drew Noakes Points 69288
Binding RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...

La valeur par défaut de l'attribut de l' RelativeSource est le Mode de la propriété. Un ensemble complet de valeurs valides est donnée ici (à partir de MSDN):

  • PreviousData Permet de lier les données précédentes (qui contrôle qui contient l'élément de données) dans la liste des éléments de données en cours d'affichage.

  • TemplatedParent fait référence à l'élément pour lequel le modèle (dans lequel la liaison de données de l'élément existe) est appliquée. Ceci est similaire à la définition des TemplateBindingExtension et n'est applicable que si la Liaison est à l'intérieur d'un modèle.

  • L'autonomie fait référence à l'élément sur lequel vous définissez la liaison et vous permet de lier une propriété de l'élément à l'autre de la propriété sur le même élément.

  • FindAncestor fait référence à l'ancêtre de la mère de la chaîne de la liaison de données de l'élément. Vous pouvez l'utiliser pour se lier à un ancêtre d'un type spécifique ou de ses sous-classes. C'est le mode que vous utilisez, si vous souhaitez spécifier AncestorType et/ou AncestorLevel.

133voto

Jeffrey Knight Points 2654

Voici une explication plus visuelle dans le cadre d’une architecture MVVM :

enter image description here

81voto

ajdotnet Points 631

Voici la feuille de triche qui n’aide ne pas être confus : http://www.nbdtech.com/Free/WpfBinding.pdf

-aj

44voto

Imaginez ce cas, un rectangle que nous voulons que sa hauteur est toujours égale à sa largeur, un carré disons. Nous pouvons faire cela en utilisant le nom de l'élément

<Rectangle Fill="Red" Name="rectangle" 
                    Height="100" Stroke="Black" 
                    Canvas.Top="100" Canvas.Left="100"
                    Width="{Binding ElementName=rectangle,
                    Path=Height}"/>

Mais dans ce cas ci-dessus, nous sommes dans l'obligation d'indiquer le nom de l'objet de liaison, à savoir le rectangle. On peut atteindre le même but différemment à l'aide de la RelativeSource

<Rectangle Fill="Red" Height="100" 
                   Stroke="Black" 
                   Width="{Binding RelativeSource={RelativeSource Self},
                   Path=Height}"/>

Pour ce cas, nous ne sommes pas obligés de mentionner le nom de l'objet de liaison et la Largeur sera toujours égale à la Hauteur à chaque fois que la modification de la hauteur.

Si vous voulez paramètre de la Largeur à la moitié de la hauteur, alors vous pouvez le faire en ajoutant un convertisseur pour la Liaison d'extension de balisage. Imaginons un autre cas maintenant:

 <TextBlock Width="{Binding RelativeSource={RelativeSource Self},
                   Path=Parent.ActualWidth}"/>

Le cas ci-dessus est utilisé pour attacher une propriété donnée d'un élément donné à l'un de ses parent direct que cet élément contient une propriété qui est appelé Parent. Ce qui nous amène à une autre source par rapport au mode qui est le FindAncestor.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X