Как отфильтровать иерархию дерева просмотра wpf, используя ICollectionView?

У меня есть гипотетическое древовидное представление, которое содержит эти данные:

RootNode
   Leaf
   vein
SecondRoot
   seeds
   flowers

Я пытаюсь отфильтровать узлы, чтобы показать только те узлы, которые содержат определенный текст. Скажи, если я укажу "L", дерево будет отфильтровано и покажет только RootNode->Leaf и SecondRoot->цветы (потому что они оба содержат букву L).

Следуя шаблону m-v-vm, у меня есть базовый класс TreeViewViewModel, подобный этому:

public class ToolboxViewModel
{
    ...
    readonly ObservableCollection _treeViewItems = new ObservableCollection();
    public ObservableCollection 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);
        }
    }
    ...
}

И базовая TreeViewItemViewModel:

public class ToolboxItemViewModel
{
    ...
    public string Name { get; private set; }
    public ObservableCollection Children { get; private set; }
    public bool ShowNode(string filterText)
    {
        ... return true if filterText is contained in Name or has children that contain filterText ... 
    } 
    ...
}

Все настроено в xaml, поэтому я вижу дерево и окно поиска.

Когда этот код выполняется, фильтр применяется только к корневым узлам, что недостаточно. Есть ли способ заставить фильтр работать в иерархии узлов так, чтобы мой предикат вызывался для каждого узла? Другими словами, может ли фильтр применяться к TreeView в целом?

Ответы на вопрос(5)

Ваш ответ на вопрос