2010-09-28 4 views
1

Je suis capable de se lier à l'arrière-plan d'un enfant si l'enfant est explicitement nommé dans ElementName:Comment se lier à un Contexte de l'enfant en XAML?

<TreeViewItem Header="Test" Background="{Binding ElementName=TestChild, Path=Background}"> 
    <TextBox Name="TestChild" Text="Hello?" Background="{Binding SomeBinding}" /> 
</TreeViewItem> 

Je préfère utiliser la position relative plutôt que des noms spécifiques. Est-il possible de lier à un enfant en utilisant un parent? Dans ce cas, ce sera toujours le premier enfant. Ce qui suit NE FONCTIONNE PAS mais semble comme il se doit.

<TreeViewItem Header="Test" Background="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Children[0].Background}"> 

Répondre

2

À moins que vous créez un nouveau contrôle qui hérite de Treeview (ou tout autre ItemsControl) cette habitude de travailler. Le raisonnement est tout à faire avec la façon dont la liaison fonctionne. Lorsque cette liaison est définie, Children [0] n'existe pas car la collection est vide. après la collecte est mis à jour pour inclure votre zone de texte et ne soulève pas notify qu'il a changé (son pas ObservableCollection). La seule façon de faire cela est de créer un nouveau contrôle qui a des enfants en tant que ObservableCollection. FWIW Je ne pense pas que ça vaut le coup et il vaut mieux utiliser ElementName.

+0

J'ai couru quelques tests. Votre réponse est cohérente avec les résultats. Je trouve que l'utilisation d'un événement Loaded est une solution. BSalita

+0

Oui - Si vous voulez vraiment éviter le nommer dans le XAML vous pouvez le faire en cas chargé. À mon avis si ce n'est pas différent d'utiliser ElementName (et plus de travail) –

+0

L'avantage à l'événement Loaded est que tous les nœuds peuvent partager le même événement. Je peux coller dans le Xaml au lieu d'indiquer explicitement chaque nom d'enfant. – BSalita

Questions connexes