在层次结构数据模板中筛选

本文关键字:筛选 层次结构 数据 | 更新日期: 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。