2014-09-05 2 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 в базовом исходном классе и свяжите его с этим свойством. –

ответ

0

Это можно сделать, используя ICollectionView. С вашей ObservableCollection вы могли бы сделать что-то вроде:

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

Затем связываться с SubNodesCollectionView вместо подузлами. Лямбда-обработчик будет методом, который вы можете указать для фильтрации каждого вместо того, чтобы просто возвращать true.

Смежные вопросы