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?

questionAnswers(5)

yourAnswerToTheQuestion