Extension de balisage {RelativeSource}

Fournit un moyen de spécifier la source d’une liaison en termes de relation relative dans le graphique d’objet au moment de l’exécution.

Utilisation des attributs XAML (mode Self)

<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>

Utilisation des attributs XAML (mode TemplatedParent)

<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

Valeurs XAML

Terme Description
{RelativeSource Self} Produit une valeur Mode de Self. L’élément cible doit être utilisé en tant que source pour cette liaison. Cela s’avère utile pour lier une seule propriété d’un élément à une autre propriété du même élément.
{RelativeSource TemplatedParent} Produit un élément ControlTemplate qui est appliqué en tant que source de cette liaison. Cela s’avère utile pour appliquer des informations d’exécution aux liaisons au niveau du modèle.

Remarques

Un objet Binding peut définir Binding.RelativeSource soit en tant qu’attribut sur un élément objet Binding, soit en tant que composant dans une extension de balisage {Binding}. C’est pourquoi deux syntaxes XAML différentes sont présentées.

RelativeSource est similaire à l’extension de balisage {Binding}. Il s’agit d’une extension de balisage capable de renvoyer des instances d’elle-même et prenant en charge une construction basée sur une chaîne qui transmet avant tout un argument au constructeur. Dans ce cas, l’argument passé est la valeur Mode .

Le mode Self s’avère utile pour lier une propriété d’un élément à une autre propriété du même élément et cela constitue une variation sur la liaison ElementName, mais ne nécessite pas l’attribution d’un nom à l’élément, puis un référencement de l’élément à lui-même. Si vous liez une propriété d’un élément à une autre propriété du même élément, soit les propriétés doivent utiliser le même type de propriété, soit vous devez également utiliser un élément Converter sur la liaison pour convertir les valeurs. Par exemple, vous pouvez utiliser Height comme source pour Width sans conversion, mais vous avez besoin d’un convertisseur pour utiliser IsEnabled comme source de visibilité.

Voici un exemple. Ce Rectangle utilise une extension de balisage {Binding} pour que ses éléments Height et Width soient toujours égaux. Il est donc restitué sous forme d’un carré. Seule la hauteur est définie en tant que valeur fixe. Pour ce Rectangle, sa propriété DataContext par défaut a la valeur null et non this. Par conséquent, pour faire en sorte que la source du contexte de données soit l’objet lui-même (et permettre la liaison à ses autres propriétés), nous utilisons l’argument RelativeSource={RelativeSource Self} dans l’utilisation de l’extension de balisage {Binding}.

<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>

Une autre utilisation de RelativeSource={RelativeSource Self} sert à définir le DataContext d’un objet sur lui-même. Par exemple, vous pouvez voir cette technique dans certains exemples de SDK où la classe Page a été étendue avec une propriété personnalisée qui fournit déjà un modèle d’affichage prêt à l’utilisation pour sa propre liaison de données, par exemple : <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

Remarque L’utilisation XAML de l’élément RelativeSource indique uniquement l’utilisation pour laquelle il est prévu : l’affectation d’une valeur à Binding.RelativeSource en XAML dans le cadre d’une expression de liaison. En théorie, d’autres utilisations sont possibles si vous définissez une propriété dont la valeur est RelativeSource.