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!
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.
{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.