Можно ли отфильтровать ICollectionView, чтобы показывать только детей вместо всей иерархии? - PullRequest
0 голосов
/ 18 октября 2018

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

    } 
...