2014-09-05 29 views
1

假设我有一个Node类过滤在HierarchicalDataTemplate

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

在基础源类中具有“CollectionViewSource”或“ICollectionView”类型的属性并与该属性绑定。 – 2014-09-05 13:31:36

回答

0

这可以通过使用ICollectionView来完成。从你的ObservableCollection,你可以这样做:

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

然后结合SubNodesCollectionView,而不是子节点。 lambda处理程序将是您可以指定的一种方法,通过而不是仅返回true来过滤每个方法。