Wie filtere ich eine wpf-Strukturansichtshierarchie mit einer ICollectionView?

Ich habe eine hypothetische Baumansicht, die diese Daten enthält:

RootNode
   Leaf
   vein
SecondRoot
   seeds
   flowers

Ich versuche, die Knoten zu filtern, um nur die Knoten anzuzeigen, die einen bestimmten Text enthalten. Sagen wir, wenn ich "L" spezifiziere, wird der Baum gefiltert und zeigt nur RootNode-> Leaf und SecondRoot-> Flowers (weil beide den Buchstaben L enthalten).

Nach dem Muster m-v-vm habe ich eine grundlegende TreeViewViewModel-Klasse wie diese:

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);
        }
    }
    ...
}

Und ein einfaches 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 ... 
    } 
    ...
}

Alles ist in der XAML eingerichtet, also sehe ich die Baumansicht und das Suchfeld.

Wenn dieser Code ausgeführt wird, gilt der Filter nur für die Stammknoten, was nicht ausreicht. Gibt es eine Möglichkeit, den Filter in der Hierarchie der Knoten herunterzulaufen, sodass mein Prädikat für jeden Knoten aufgerufen wird? Kann der Filter also auf die gesamte TreeView angewendet werden?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage