我有一个假设的树形视图,其中包含这些数据:
RootNode
Leaf
vein
SecondRoot
seeds
flowers
我试图筛选节点,以仅显示包含特定文本的节点。例如,如果我指定“L”,则会过滤树并仅显示RootNode->Leaf和SecondRoot->flowers(因为它们都包含字母L)。
遵循m-v-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?