web-dev-qa-db-fra.com

Comment puis-je me connecter à RelativeSource Self?

J'essaie de lier plusieurs propriétés différentes dans mon Xaml:

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"               
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}"  
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" />

Vous remarquerez que j'ai utilisé deux techniques de reliure différentes ici. Ceux qui utilisent le nom d'élément fonctionnent, l'autre pas. Voici le code derrière:

public string Description
{
     get { return (string)GetValue(DescriptionProperty); }
     set { SetValue(DescriptionProperty, value); }
}
public static readonly DependencyProperty DescriptionProperty = 
DependencyProperty.Register("Description", typeof(string), typeof(UserControl), 
new UIPropertyMetadata(""));

Chaque reliure a un nom différent mais elles ressemblent toutes à cela pour la plupart. Je veux que ma reliure puisse fonctionner avec:

{Binding Description}

Au lieu de:

{Binding Path=Description, ElementName=_UserInputOutput}

Il ne semble fonctionner que lorsque ElementName est utilisé. J'ai besoin d'exporter/importer ce XAML, donc je ne peux pas avoir un ElementName ou l'importation ne fonctionnera pas.

Je pensais que ce serait mieux:

{Binding Path=Description, RelativeSource={RelativeSource Self}}

Cela n'a pas fonctionné.

Des idées?? Je vous remercie!

17
B-Rad

Vous n'avez pas défini le DataContext, qui est ce que RelativeSource utilise pour déterminer à quoi il est relatif. Vous devez définir le DataContext à un niveau supérieur, comme UserControl. J'ai généralement:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
</UserControl>

Cela indique à UserControl de se lier lui-même la classe dans le codebehind.

30
Joel Lucsy

{RelativeSource Self} cible l'objet qui possède la propriété qui est liée, si vous avez une telle liaison sur un Label il recherchera Label.Description, qui n'est pas là. À la place, vous devez utiliser {RelativeSource AncestorType=UserControl}.

Les liaisons sans source (ElementName, Source, RelativeSource) sont relatives à DataContext, cependant dans UserControls vous devez évitez de définir DataContext pour ne pas jouer avec les liaisons externes.

35
H.B.