У меня есть гипотетический вид дерева, который содержит эти данные:Как фильтровать иерархию дерева wpf с помощью ICollectionView?
RootNode
Leaf
vein
SecondRoot
seeds
flowers
Я пытаюсь фильтровать узлы для того, чтобы показать только те узлы, которые содержат определенный текст. Скажем, если я укажу «L», дерево будет фильтроваться и отображать только RootNode-> Leaf и SecondRoot-> flowers (потому что они оба содержат букву L).
Следуя схеме мв-Vm, у меня есть базовый класс TreeViewViewModel так:
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);
}
}
...
}
И основной 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 ...
}
...
}
Все настройки в XAML, так что я вижу TreeView и окно поиска.
При выполнении этого кода фильтр применяется только к корневым узлам, которых недостаточно. Есть ли способ заставить фильтр просачиваться в иерархию узлов, чтобы мой предикат вызывался для каждого узла? Другими словами, может ли фильтр применяться к TreeView в целом?
Что вы в конечном итоге делает ? Любая информация о производительности, которую вы можете передать или другое решение? –