【发布时间】:2010-11-21 17:59:25
【问题描述】:
我有一个包含这些数据的假设树视图:
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吗?
【问题讨论】:
-
你最后做了什么?您可以传递任何性能信息或其他解决方案吗?