Wpf 树视图的IsSynchronizedWithCurrentItem属性(或等效属性)在哪里?

Wpf 树视图的IsSynchronizedWithCurrentItem属性(或等效属性)在哪里?,wpf,data-binding,Wpf,Data Binding,我有一个典型的windows/文件资源管理器一样的设置 左侧我有一个树状视图所有数据绑定,显示层次结构中的节点 右侧有一个显示Node.Properties的列表视图 ListView有一个IsSynchronizedWithCurrentItem属性,该属性可以启动。e、 g.如果我有另一个显示节点列表的ListView,并且两个ListView都将此属性设置为true。更改NodeListView中节点的选择将自动更新PropertiesListView 现在我需要一个NodesTree

我有一个典型的windows/文件资源管理器一样的设置

  • 左侧我有一个树状视图所有数据绑定,显示层次结构中的节点
  • 右侧有一个显示Node.Properties的列表视图
ListView有一个IsSynchronizedWithCurrentItem属性,该属性可以启动。e、 g.如果我有另一个显示节点列表的ListView,并且两个ListView都将此属性设置为true。更改NodeListView中节点的选择将自动更新PropertiesListView

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


对于这个问题,有没有更“WPF方式”的解决方案?或者我必须处理树的NodeSelectChanged事件并通过代码刷新listView。

我的解决方案非常小。。不知道它是否等同于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
}
//XAML

我不知道为什么它没有实现这个属性,但我有一个建议

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

ICollectionView接口包含名为CurrentItem的成员。IsSynchronizedWithCurrentItem的作用是:每当单击ItemsControl上的某个项时,它都会为集合视图设置CurrentItem。ICollectionView还有两个事件:CurrentItemChanged和CurrentItemChanged。设置IsSynchronizedWithCurrentItem属性时,Items控件将根据ICollectionView的CurrentItem更新SelectedItem。有道理吗

在master/detail WPF场景中,我们只是绑定到ICollectionView及其CurrentItem(CurrentItem语法类似于{binding Items/Name},其中Name是集合的CurrentItem上的Name属性)

因此,尽管您的代码是为您的目的而工作的,但它不会执行该属性所做的操作。要执行该属性所做的操作,您需要执行以下操作:

  • 当一个项目被选中时,你需要弄清楚它属于哪个集合。我们怎么做?我相信这就是TreeView没有实现它的原因。选中的项目显示在一个TreeView项目中。DataContext是对象本身,但父集合是什么?我想你可以将它缓存在一些hashmap中(很傻,但会有用)或者您可以沿着逻辑树走,获取TreeViewItem的父项,该父项恰好是ItemsControl。ItemsSource属性将是您的集合
  • 获取该集合的ICollectionView
  • 需要将ICollectionView强制转换为CollectionView(ICollectionView不实现CurrentItem setter)
  • 在CollectionView实例上调用SetCurrent(..,..)
  • 现在,绑定到该ICollectionView的CurrentItem的任何内容都将被更新


    这比我预期的要长。请告诉我是否需要进一步澄清。

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

    <TreeView Name="CategoryName" ItemsSource="{Binding Source={StaticResource A_Collection}, Path=RootItems}" />
    
    
    
    然后,您可以使用以下方法绑定详细信息UI元素(如文本框):

    
    
    将导致文本框绑定到树视图中当前选定项的Name属性

    如果您想将许多UI项绑定到所选树视图项目的详细信息,请考虑在包含所有细节控件(DOCKPANT/Grid/StAdCtPad等)的元素中设置DATCONTRONT。

    代码>

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

    绝对是解决方案,具有魅力!仅供参考:无法通过Blend GUI绑定此项。
    <TextBox Text="{Binding ElementName=CategoryTreeView, Path=SelectedValue.Name}"/>
    
    <ListView Name="listView1" 
        ItemsSource="{Binding Path=SelectedItem.Modules, 
                              ElementName=treeView1, Mode=OneWay}" 
        IsSynchronizedWithCurrentItem="True">