Привязка к свойству родительского объекта с помощью 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 Привязка, вероятно, смотрит дальше вверх по логическому дереву, и поэтому ваша привязка не работает.

Другие вопросы по тегам