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?

questionAnswers(5)

yourAnswerToTheQuestion