我需要制作一个可搜索的TreeView。如果任何项目与搜索文本匹配,则其所有父项将自动匹配并展开。任何不匹配的东西都会失去其可见性。
这是我的(示例)界面和过滤代码:
.D:\\Node Applications\\public\\home.htmlindex.html
这个问题与算法无关;据我所知,它工作得很好,并没有任何瓶颈。我的问题是所有节点上interface ITreeItem : INotifyPropertyChanged {
IList<ITreeItem> Children { get; }
string Header { get; }
bool IsExpanded { get; set; }
bool IsVisible { get; set; }
}
void Filter(ITreeItem item, string text) {
foreach (var subItem in item.Children) {
Filter(subItem, text);
}
if (item.Header.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0)
item.IsVisible = true;
else {
foreach (var subItem in item.Children) {
if (subItem.IsMatch) {
item.IsVisible = true;
item.IsExpanded = true;
return;
}
}
item.IsVisible = false;
item.IsExpanded = false;
}
}
的{{1}}。当树具有非平凡数量的项目时(我可以通过100个项目得到显着的延迟,每个项目有100个子项目),因为UI被这些属性更改轰炸,所以会有很大的停顿。
我认为只要重建列表并在搜索文本发生变化时手动分配TreeView的NotifyPropertyChanged
,但另一个不相关的功能(添加/重命名项目)意味着此解决方案需要很多额外的簿记。