我一直在尝试对ObservableCollection(类似于TreeView)进行过滤,以仅显示过滤器的确切匹配,而不是整个层次结构。无需添加第二个ObservableCollection即可完成此操作,因为那样会使整个代码难以维护。
例如,假设我们具有以下层次结构:
Item1
-Item1-1
-Item1-2
--Item1-2-1
---Item1-2-1-1
Item2
-Item2-1
-Item2-2
我想用“ -2”过滤。我期望的结果是:
Item1-2
Item1-2-1
Item1-2-1-1
Item2-2
但是我得到的结果是这样的:
Item1
-Item1-2
--Item1-2-1
---Item1-2-1-1
Item2
-Item2-1
因此,过滤后不会显示任何类型的层次结构。这可能吗?到目前为止,我得到的是以下用于过滤的代码:
private ICollectionView _visibleItems;
public ICollectionView VisibleItems
{
get
{
return GetVisibleItems(_items);
}
}
private ICollectionView GetVisibleItems( ObservableCollection<TreeSource> ts )
{
if (ts != null)
{
_visibleItems = CollectionViewSource.GetDefaultView(ts);
_visibleItems.Filter = i => !(( TreeSource )i).IsFilteredOut;
RaisePropertyChanged("VisibleItems");
}
return _visibleItems;
}
public string Filter
{
get { return _filter; }
set
{
SetProperty(ref _filter, value);
foreach (TreeSource item in _items)
{
item.ApplyFilter(_filter);
}
VisibleItems.Refresh();
}
}
internal void ApplyFilter(string filter)
{
IsFilteredOut = Text.IndexOf(filter, StringComparison.OrdinalIgnoreCase) < 0;
if (Children == null)
return;
foreach (var child in Children)
{
child.ApplyFilter(filter);
//if (!child.IsFilteredOut)
//{
// IsFilteredOut = false;
//}
}
VisibleChildren.Refresh();
}