Давайте предположим, что у меня есть класс 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» никогда не вызывается. Итак, каков правильный способ сделать это?
Имейте свойство типа CollectionViewSource или ICollectionView в базовом исходном классе и свяжите его с этим свойством. –