C# HierarchycalDataTemplate中的筛选

C# HierarchycalDataTemplate中的筛选,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,假设我有一个节点类 public class Node { public string Name; public ObservableCollection<Node> SubNodes; } 并享受结果 现在,我想将我自己的过滤函数(比如“MyFilterFun”)应用于树状视图中的所有节点。为此,我将HierarchycalDataTemplate修改为 Tree.ItemsSource = my_Observable_Collection_Of_Nodes;

假设我有一个节点类

public class Node
{
    public string Name;
    public ObservableCollection<Node> SubNodes;
}
并享受结果

现在,我想将我自己的过滤函数(比如“MyFilterFun”)应用于树状视图中的所有节点。为此,我将HierarchycalDataTemplate修改为

Tree.ItemsSource = my_Observable_Collection_Of_Nodes;
<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来完成。根据您的观察收集,您可以执行以下操作:

SubNodesCollectionView = CollectionViewSource.GetDefaultView(SubNodes);
SubNodesCollectionView.Filter = (param) => 
{ 
    return true; 
};

然后绑定到子节点CollectionView,而不是子节点。lambda处理程序将是一种方法,您可以指定它来筛选每个对象,而不是仅返回true。

在基础源类中具有类型为
CollectionViewSource
ICollectionView
的属性,并使用该属性绑定。
SubNodesCollectionView = CollectionViewSource.GetDefaultView(SubNodes);
SubNodesCollectionView.Filter = (param) => 
{ 
    return true; 
};