TreeView的IsSynchronizedWithCurrentItem属性(或等效属性)在哪里?

时间:2008-12-17 09:50:51

标签: wpf data-binding

Tell me it ain't so

我有一个典型的Windows /文件浏览器,如设置。

  • 左侧我有一个TreeView所有数据绑定显示层次结构中的节点
  • 右侧我有一个显示Node.Properties的ListView

ListView有一个IsSynchronizedWithCurrentItem属性。例如如果我有另一个ListView显示节点列表,并且两个listViews都将此属性设置为true。在NodesListView中更改节点选择将自动更新PropertiesListView。

现在我需要与NodesTreeView和PropertiesListView相同的东西......并且看起来TreeView没有这样的属性。

是否有更多的'WPF方式'解决这个问题?或者我是否必须处理Tree的NodeSelectionChanged事件并通过代码刷新listView。

4 个答案:

答案 0 :(得分:6)

一个非常简单的解决方案是将“详细信息”UI元素绑定到TreeView的SelectedValue属性。例如,如果您的TreeView看起来像这样:

<TreeView Name="CategoryName" ItemsSource="{Binding Source={StaticResource A_Collection}, Path=RootItems}" />

然后您可以使用以下方法绑定详细信息UI元素(如文本框)

<TextBox Text="{Binding ElementName=CategoryTreeView, Path=SelectedValue.Name}"/>

会导致文本框绑定到TreeView中当前所选项目的Name属性。

如果要将许多UI项目绑定为所选TreeView项目的详细信息,请考虑在包含所有详细信息控件(DockPanel / Grid / StackPanel等)的elemtent上设置DataContext。

答案 1 :(得分:4)

<ListView Name="listView1" 
    ItemsSource="{Binding Path=SelectedItem.Modules, 
                          ElementName=treeView1, Mode=OneWay}" 
    IsSynchronizedWithCurrentItem="True">

其中“.Modules”是您要显示的所选树视图项目的子项集合。不要担心在树视图上连接“SelectedItemChanged”事件。

答案 2 :(得分:3)

为什么它没有实现该属性,我不知道,但我有一个建议在下面。

上面的代码可以使用,但是,它不是IsSynchronizedWithCurrentItem属性的作用。任何ItemsControl都绑定到ItemsSource属性的ICollectionView。要获取ICollectionView,我们可以调用CollectionViewSource.GetDefaultCollectionView(object o)。根据对象的类型o,您将获得ICollectionView接口的不同具体实现。 CollectionView和ListCollectionView是我想到的两个具体类。

ICollectionView接口包含一个名为CurrentItem的成员。 IsSynchronizedWithCurrentItem的作用是:只要在ItemsControl上单击某个项目,它就会为集合视图设置CurrentItem。 ICollectionView还有两个事件:CurrentItemChanging和CurrentItemChanged。设置IsSynchronizedWithCurrentItem属性后,ItemsControl将根据ICollectionView的CurrentItem更新SelectedItem。有意义吗?

在主/详细WPF场景中,我们只是绑定到ICollectionViews及其CurrentItem(CurrentItem语法类似于{Binding Items / Name},其中Name是集合的CurrentItem上的Name属性。

因此,虽然您的代码适用于您的目的,但它不会执行该属性的功能。要执行该属性的操作,您需要执行以下操作:

  1. 选择项目时,您需要确定它属于哪个集合。我们如何做到这一点?我相信这就是TreeView没有实现它的原因。所选项目显示在TreeViewItem中。 DataContext是对象本身,但父集合是什么?我想要得到它你可以将它缓存在一些hashmap中(愚蠢,但会起作用)或者你可以走上逻辑树并获得恰好是ItemsControl的TreeViewItem的父级。 ItemsSource属性将是您的集合。
  2. 获取该集合的ICollectionView。
  3. 需要将ICollectionView强制转换为CollectionView(ICollectionView不实现CurrentItem setter)
  4. 在CollectionView实例
  5. 上调用SetCurrent(..,..)

    现在,将更新绑定到ICollectionView的CurrentItem的任何内容。

    这比我想象的要长。如果需要进一步澄清,请与我们联系。

答案 3 :(得分:0)

我对此的解决方案结果非常小..不知道它是否等同于IsSynchronizedWithCurrentItem。 ListView按预期刷新。

// the XAML
<TreeView DockPanel.Dock="Left" x:Name="tvwNodes" ItemsSource="{Binding}" SelectedItemChanged="OnNewNodeSelected"/>
<ListView x:Name="lvwProperties" ItemsSource="{Binding Path=Properties}"

// the code-behind
private void OnNewNodeSelected(object sender, RoutedPropertyChangedEventArgs<object> e)
{
  lvwProperties.DataContext = tvwNodes.SelectedItem; // this returns the selected Node obj
}