我们假设我有一个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”永远不会被调用。 那么正确的做法是什么?
答案 0 :(得分:0)
这可以通过使用ICollectionView来完成。从您的ObservableCollection中,您可以执行以下操作:
SubNodesCollectionView = CollectionViewSource.GetDefaultView(SubNodes);
SubNodesCollectionView.Filter = (param) =>
{
return true;
};
然后绑定到SubNodesCollectionView而不是SubNodes。 lambda处理程序将是一个方法,您可以指定过滤每个方法,而不是仅返回true。