2009-07-28 82 views
2

我有一个包含两列网格的窗口。 第一列填充了一个TreeView。 第二列填充了一个ListBox。WPF Treeview - 与ViewModel同步?

这两个控件都绑定到包装我的数据的CollectionView - 我的数据类类型的ObserveableCollection。 ListBox被设置为保持与视图同步(SyncToCurrentItem等)。我还实现了一个自定义ListBoxItem,它调用BringIntoView和Focus在新选定的项目上。

但是,Treeview不支持对CollectionView进行这种操作。

有没有办法做到这一点?我想要做的是在树中选择一些东西,并在列表框中选中它。

在此先感谢您的帮助。

回答

4

要使ListBox与TreeView保持同步,您需要将SelectedItem绑定到TreeView的SelectedItem。由于TreeView SelectedItem是只读的,绑定模式需要是单向的。这里有一个例子:

<TreeView Name="CategoryTreeView" DockPanel.Dock="Top" MinHeight="50" MinWidth="100"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate DataType="x:Type local:Category" 
      ItemsSource="{Binding Path=Children}"> 
      <TextBlock Text="{Binding Path=Name}"></TextBlock> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 
<ListBox Name="CategoryList" SelectedItem="{Binding ElementName=CategoryTreeView, Path=SelectedItem, Mode=OneWay}"/> 

我创建了一个带有Name和Children(List)的基本Category类。使用ListBox更新TreeView是一件多余的工作,但它是可行的。让我知道你是否试图走两条路。

+0

嗨,感谢您的片段。我基本上不需要这两种方式,但如果树负责进行选择,我需要一种方法来阻止ListBox更改该选择,从而覆盖绑定(自OneWay以来)并丢失同步。有任何想法吗? – 2009-07-31 14:34:54