【发布时间】:2011-08-12 17:53:48
【问题描述】:
假设我有一个像这样的 3 级数据绑定 WPF TreeView:
- 一个
- aa
- aaa
- bbb
- ccc
- aa
- b
- 啊
- bb
- aaa
-
c
- aa
- aaa
- bb
-
抄送
- aaa
- bbb
- ccc
- aa
其中选定的节点是 c 下的 cc 下的 bbb。有没有办法从 TreeView 之外的某个控件绑定说 cc?
更新
我试图在这里理解的内容类似于如何使用以下语法绑定到 ListBox 中的选定项目:
<TextBox Text="{Binding Path=VM.Definitions/term}" />
ListBox ItemsSource 绑定到 VM.Definitions 并且 ListBox.IsSynchronizedWithCurrentItem 设置为 True。我试图弄清楚是否有类似的方法可以绑定到具有范围 HierarchicalDataTemplates 的特定级别的 TreeView。
我是如何做到的:
我接受了 H.B.答案,但正是他和蒂姆墨菲的答案让我“看到了光明”。问题是您不能 (AFAIK) 绑定到 TreeView 的级别,就像您可以绑定到 ListBox 的单个级别一样(实际上您可以,但不能绑定到 特定的 级别)。
所以我意识到,只要选择发生变化,我所要做的就是将 TreeView 的每个级别上选择的任何内容链接回我的 VM。例如,假设您有一个包含三个级别 Customer、Order、OrderItem 的 TreeView。在 SelectedItemChanged 中,您在 VM 中设置了每个级别。
如果所选项目是客户,则您将 VM.SelectedCustomer 设置为客户,并将 VM.SelectedOrder 和 VM.SelectedOrderItem 设置为 null。如果所选项目是订单,则将 VM.SelectedCustomer 设置为所选项目的父项目,将 VM.SelectedOrder 设置为所选项目,并将 VM.SelectedOrderItem 设置为 null。以此类推。
一个简单的例子(不是我的实际代码,只是为了演示这个概念):
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;
}
}
【问题讨论】:
-
你在使用 MVVM 模式吗?您喜欢哪种语言阅读?
-
我相信我所做的主要是遵循 MVVM 模式; “代码隐藏”是 C#
标签: .net wpf data-binding treeview