Я пытался отфильтровать коллекцию 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();
}