在层次结构数据模板中筛选
本文关键字:筛选 层次结构 数据 | 更新日期: 2023-09-27 18:20:42
假设我有一个Node类
public class Node
{
public string Name;
public ObservableCollection<Node> SubNodes;
}
并创建了以下xaml来可视化Node对象的集合:
<TreeView Name="Tree">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="myNamespace:Node"
ItemsSource="{Binding Path=SubNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
在代码后面我写了一些类似的东西
Tree.ItemsSource = my_Observable_Collection_Of_Nodes;
并享受结果。
现在我想将我自己的过滤功能(比如"MyFilterFun")应用到树状视图中的所有节点。为此,我将层次结构数据模板修改为类似的内容
<HierarchicalDataTemplate DataType="myNamespace:MyClass">
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding Path=SubNodes}"
Filter="MyFilterFun"/>
</BindingSource>
</Binding>
<HierarchicalDataTemplate.ItemsSource>
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
不幸的是,这不起作用,"MyFilterFun"从未被调用。那么,正确的方法是什么呢?
这可以通过使用ICollectionView来完成。从您的ObservableCollection中,您可以执行以下操作:
SubNodesCollectionView = CollectionViewSource.GetDefaultView(SubNodes);
SubNodesCollectionView.Filter = (param) =>
{
return true;
};
然后绑定到子节点集合视图,而不是子节点。lambda处理程序将是一个方法,您可以指定该方法来过滤每一个,而不仅仅是返回true。