Привязка к свойству родительского объекта с помощью RelativeSource
Я построил TreeView на основе WPF с
Вещь
-Subitem
Если выбран подэлемент, я хотел бы также отобразить свойства элемента.
<StackPanel Grid.Column="2" DataContext="{Binding ElementName=myTreeView, Path=SelectedItem}">
<TextBox Text="{Binding Path=Name, Mode=TwoWay}" />
<TextBox Text="{Binding RelativeSource={???} Path=Name, Mode=TwoWay}" />
</StackPanel>
Я думаю, что мне нужно использовать оператор RelativeSource, но не совсем уверен, как это сделать.
3 ответа
JesseJames дал вам правильный способ использования RelativeSource, но лучшее, что вы сможете сделать с RelativeSource, - это привязка к самому TreeViewItem, который является просто контейнером для вашего объекта данных, то есть ViewModel, то есть вы не сможете получить доступ к вашему свойства объектов данных (легко).
Я думаю, что в этом случае привязка к объекту контейнера нарушит используемый вами подход View-ViewModel. Лучше всего было бы создать родительский объект внутри вашей ViewModel и связать его с этим объектом. Так что теперь каждый объект в вашей коллекции имеет ссылку на своего родителя, с которой теперь можно напрямую связываться.
<StackPanel Grid.Column="2" DataContext="{Binding ElementName=myTreeView, Path=SelectedItem}">
<TextBox Text="{Binding Path=Name, Mode=TwoWay}" />
<TextBox Text="{Binding Parent.Name}" />
</StackPanel>
Также обратите внимание, что свойство SelectedItem возвращает ваш объект данных, а не контейнер.
{Binding RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}, Path=Name, Mode=TwoWay}
Я посмотрел на ваш код, попробуйте привязку просто Name
, Похоже, что ваш контекст данных уже должен быть установлен в TreeViewItem
из-за следующей строки: <StackPanel Grid.Column="2" DataContext="{Binding ElementName=myTreeView, Path=SelectedItem}">
, RelativeResource
Привязка, вероятно, смотрит дальше вверх по логическому дереву, и поэтому ваша привязка не работает.