在HierarchicalDataTemplate中过滤

时间:2014-09-05 13:10:30

标签: c# wpf xaml mvvm

我们假设我有一个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修改为类似

的内容
<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”永远不会被调用。 那么正确的做法是什么?

1 个答案:

答案 0 :(得分:0)

这可以通过使用ICollectionView来完成。从您的ObservableCollection中,您可以执行以下操作:

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

然后绑定到SubNodesCollectionView而不是SubNodes。 lambda处理程序将是一个方法,您可以指定过滤每个方法,而不是仅返回true。