Como filtrar uma hierarquia wdf treeview usando um ICollectionView?
Eu tenho uma visão de árvore hipotética que contém esses dados:
RootNode
Leaf
vein
SecondRoot
seeds
flowers
Eu estou tentando filtrar os nós para mostrar apenas os nós que contêm um determinado texto. Digamos que se eu especificar "L", a árvore será filtrada e mostrará apenas RootNode-> Leaf e SecondRoot-> flowers (porque ambos contêm a letra L).
Seguindo o padrão m-v-vm, eu tenho uma classe básica TreeViewViewModel assim:
public class ToolboxViewModel
{
...
readonly ObservableCollection<TreeViewItemViewModel> _treeViewItems = new ObservableCollection<TreeViewItemViewModel>();
public ObservableCollection<TreeViewItemViewModel> Headers
{
get { return _treeViewItems; }
}
private string _filterText;
public string FilterText
{
get { return _filterText; }
set
{
if (value == _filterText)
return;
_filterText = value;
ICollectionView view = CollectionViewSource.GetDefaultView(Headers);
view.Filter = obj => ((TreeViewItemViewModel)obj).ShowNode(_filterText);
}
}
...
}
E um TreeViewItemViewModel básico:
public class ToolboxItemViewModel
{
...
public string Name { get; private set; }
public ObservableCollection<TreeViewItemViewModel> Children { get; private set; }
public bool ShowNode(string filterText)
{
... return true if filterText is contained in Name or has children that contain filterText ...
}
...
}
Tudo está configurado no xaml, então vejo a treeview e a caixa de pesquisa.
Quando este código é exercido, o filtro só se aplica aos nós raiz que são insuficientes. Existe uma maneira de fazer o filtro escorrer na hierarquia de nós para que meu predicado seja chamado para cada nó? Em outras palavras, o filtro pode ser aplicado ao TreeView como um todo?