2008-12-17 85 views
6

Tell me it ain't soTreeView的IsSynchronizedWithCurrentItem属性(或等效项)在哪里?

我有一个典型的Windows /文件浏览器像安装程序。

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

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

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

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

回答

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 
} 
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语法是一样的东西{绑定表项/名称},其中名称是对集合的CURRENTITEM Name属性。

所以。虽然你的代码适用于你的目的,它不这样做,物业确实做什么的财产做什么,你需要做到以下几点:

  1. 当一个项目被选中,你需要弄清楚哪些我们如何做到这一点?我相信这就是为什么TreeView没有实现它。所选的项目显示在TreeViewIte中米DataContext是对象本身,但父集合是什么?我想要得到它你可以缓存它在一些hashmap(愚蠢的,但将工作),或者你可以走上逻辑树,并得到TreeViewItem的父母碰巧是一个ItemsControl。 ItemsSource属性将是您的集合。
  2. 获取该集合的ICollectionView。
  3. 需要该ICollectionView铸造成的CollectionView上的CollectionView实例

现在(ICollectionView不执行CURRENTITEM二传手)

  • 呼叫的setCurrent(..,..),绑定到任何东西ICollectionView的CurrentItem将被更新。

    这变得比我预期的要长。让我知道是否有任何进一步的澄清是必要的。

  • 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中选择的项目。

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

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

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

    +0

    为什么这个答案不被接受? – Dabblernl 2012-07-28 20:38:20