Скажем, у меня есть трехуровневый WPF TreeView с привязкой к данным, подобный этому:
где выбранный узел bbb в cc в c . Есть ли способ связать, скажем, cc , от какого-либо элемента управления, живущего вне TreeView?
UPDATE
Здесь я пытаюсь найти нечто похожее на то, как вы можете привязать выбранный элемент в ListBox, используя этот синтаксис:
<TextBox Text="{Binding Path=VM.Definitions/term}" />
, где ListBox ItemsSource связан с VM.Definitions и ListBox.IsSynchronizedWithCurrentItem установлен в True. Я пытаюсь выяснить, существует ли подобный подход для привязки к определенному уровню TreeView с областью действия HierarchicalDataTemplates.
КАК ЭТО РАБОТАЕТ:
Я принял H.B. ответы, но это была комбинация ответов его и Тима Мерфи, которые заставили меня «увидеть свет». Дело в том, что вы не можете (AFAIK) привязать к уровням TreeView, как вы можете привязать к одному уровню ListBox (на самом деле вы можете, но не к определенному уровню ).
Итак, я понял, что все, что мне нужно сделать, это связать обратно с моей виртуальной машиной все, что выбрано на каждом уровне TreeView, всякий раз, когда выбор изменяется. Например, скажем, у вас есть TreeView с тремя уровнями Customer, Order, OrderItem. В SelectedItemChanged вы устанавливаете в своей виртуальной машине каждый уровень.
Если выбранный элемент является Customer, тогда для VM.SelectedCustomer установлено значение Customer, а для VM.SelectedOrder и VM.SelectedOrderItem установлено значение null. Если выбранный элемент является Порядком, то вы устанавливаете VM.SelectedCustomer в родительский элемент выбранного элемента, вы устанавливаете VM.SelectedOrder для выбранного элемента, а VM.SelectedOrderItem равным нулю. И так далее.
Быстрый пример (не мой настоящий код, просто для демонстрации концепции):
void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (treeViewLesson.SelectedItem == null) {
VM.SelectedOrderItem = null;
VM.SelectedOrder = null;
VM.SelectedCustomer = null;
}
else if (treeViewLesson.SelectedItem is Customer) {
VM.SelectedOrderItem = null;
VM.SelectedOrder = null;
VM.SelectedCustomer = treeViewLesson.SelectedItem as Customer;
}
else if (treeViewLesson.SelectedItem is Order) {
VM.SelectedOrderItem = null;
VM.SelectedOrder = treeViewLesson.SelectedItem as Order;
VM.SelectedCustomer = VM.SelectedOrder.ParentCustomer;
}
else if (treeViewLesson.SelectedItem is OrderItem) {
VM.SelectedOrderItem = treeViewLesson.SelectedItem as OrderItem;
VM.SelectedOrder = VM.SelectedOrderItem.ParentOrder;
VM.SelectedCustomer = VM.SelectedOrder.ParentCustomer;
}
}