Jak filtrować hierarchię widoku drzewa WPF za pomocą ICollectionView?
Mam hipotetyczny widok drzewa zawierający te dane:
RootNode
Leaf
vein
SecondRoot
seeds
flowers
Próbuję filtrować węzły, aby wyświetlić tylko węzły zawierające określony tekst. Powiedz, jeśli określę „L”, drzewo zostanie przefiltrowane i pokaże tylko RootNode-> Leaf i SecondRoot-> kwiaty (ponieważ oba zawierają literę L).
Podążając za wzorcem m-v-vm, mam podstawową klasę TreeViewViewModel taką jak ta:
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);
}
}
...
}
I podstawowy TreeViewItemViewModel:
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 ...
}
...
}
Wszystko jest skonfigurowane w xaml, więc widzę widok drzewa i pole wyszukiwania.
Gdy ten kod jest wykonywany, filtr ma zastosowanie tylko do niewystarczających węzłów głównych. Czy istnieje sposób, aby filtr spływał w hierarchii węzłów, aby mój predykat był wywoływany dla każdego węzła? Innymi słowy, czy filtr można zastosować do TreeView jako całości?