Passer au contenu principal
Version : 11.0.0

Comment lier à un contrôle

Avec Avalonia UI, ainsi que la liaison à un contexte de données, vous pouvez également lier un contrôle directement à un autre.

POUR VOTRE INFORMATION

Notez que cette technique n'utilise pas du tout de contexte de données. Lorsque vous faites cela, vous liez directement à un autre contrôle lui-même.

Liaison à un contrôle nommé

Si vous souhaitez lier à une propriété d'un autre contrôle nommé, vous pouvez utiliser le nom du contrôle précédé d'un caractère #.

<TextBox Name="other">

<!-- Lie à la propriété Text du contrôle "other" -->
<TextBlock Text="{Binding #other.Text}"/>

Ceci est l'équivalent de la liaison en forme longue qui sera familière aux utilisateurs de WPF et UWP :

<TextBox Name="other">
<TextBlock Text="{Binding Text, ElementName=other}"/>

Avalonia UI prend en charge les deux syntaxes.

Liaison à un ancêtre

Vous pouvez lier au parent (arbre logique de contrôle) de la cible en utilisant la syntaxe $parent :

<Border Tag="Hello World!">
<TextBlock Text="{Binding $parent.Tag}"/>
</Border>

Ou à tout niveau d'ancêtre en utilisant un index avec la syntaxe $parent :

<Border Tag="Hello World!">
<Border>
<TextBlock Text="{Binding $parent[1].Tag}"/>
</Border>
</Border>

L'index est basé sur zéro, donc $parent[0] équivaut à $parent.

Vous pouvez également vous lier à l'ancêtre le plus proche d'un type donné, comme ceci :

<Border Tag="Hello World!">
<Decorator>
<TextBlock Text="{Binding $parent[Border].Tag}"/>
</Decorator>
</Border>

Enfin, vous pouvez combiner l'index et le type :

<Border Tag="Hello World!">
<Border>
<Decorator>
<TextBlock Text="{Binding $parent[Border;1].Tag}"/>
</Decorator>
</Border>
</Border>

Si vous devez inclure un espace de noms XAML dans le type d'ancêtre, vous séparez l'espace de noms et la classe en utilisant un deux-points, comme ceci :

<local:MyControl Tag="Hello World!">
<Decorator>
<TextBlock Text="{Binding $parent[local:MyControl].Tag}"/>
</Decorator>
</local:MyControl>

Pour accéder à une propriété du DataContext d'un parent, il sera nécessaire de le caster avec une expression de casting (vm:MyUserControlViewModel)DataContext à son type réel. Sinon, DataContext serait considéré comme de type object et accéder à une propriété personnalisée entraînerait une erreur de compilation.

<local:MyControl Tag="Hello World!">
<Decorator>
<TextBlock Text="{Binding $parent[local:MyControl].((vm:MyUserControlViewModel)DataContext).CustomProperty}"/>
</Decorator>
</local:MyControl>
avertissement

Avalonia UI prend également en charge la syntaxe RelativeSource de WPF/UWP qui fait quelque chose de similaire, mais n'est pas la même chose. RelativeSource fonctionne sur l'arbre visuel tandis que la syntaxe donnée ici fonctionne sur l'arbre logique.