2010-09-28 5 views
1

Я способен связываться с фон ребенка, если ребенок явно указан в ElementName:Как привязать к детскому фону в Xaml?

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

Я предпочитаю использовать относительное положение, а не конкретные имена. Можно ли связать ребенка с родственником? В этом случае он всегда будет первым ребенком. Следующий НЕ РАБОТАЕТ, но кажется, что он должен.

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

ответ

2

Если вы не создать новый элемент управления, который наследуется от Treeview (или любой другой ItemsControl) этого не будут работать. Обоснование - это все, что связано с тем, как работает привязка. Когда эта привязка установлена, Children [0] не существует, поскольку коллекция пуста. после этого коллекция обновляется для включения вашего текстового поля и не вызывает уведомления о том, что она изменилась (это не ObservableCollection). Единственный способ сделать это - создать новый элемент управления, в котором есть дети как ObservableCollection. FWIW Я не думаю, что это стоит хлопот, и вам лучше использовать ElementName.

+0

Я провел несколько тестов. Ваш ответ согласуется с результатами. Я считаю, что использование события Loaded является решением. BSalita

+0

Да. Если вы действительно хотите избежать их именования в XAML, вы можете сделать это в загруженном событии. На мой взгляд, хотя это ничем не отличается от использования ElementName (и больше работы) –

+0

Преимущество события Loaded заключается в том, что все узлы могут совместно использовать одно и то же событие. Я могу вставить в Xaml, а не явно указывать каждое дочернее имя. – BSalita

Смежные вопросы