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?