我有一个典型的Windows /文件浏览器,如设置。
ListView有一个IsSynchronizedWithCurrentItem属性。例如如果我有另一个ListView显示节点列表,并且两个listViews都将此属性设置为true。在NodesListView中更改节点选择将自动更新PropertiesListView。
现在我需要与NodesTreeView和PropertiesListView相同的东西......并且看起来TreeView没有这样的属性。
是否有更多的'WPF方式'解决这个问题?或者我是否必须处理Tree的NodeSelectionChanged事件并通过代码刷新listView。
答案 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属性。
因此,虽然您的代码适用于您的目的,但它不会执行该属性的功能。要执行该属性的操作,您需要执行以下操作:
现在,将更新绑定到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
}