是否可以过滤ICollectionView以仅显示子级而不是整个层次结构?

时间:2018-10-17 22:56:24

标签: c# wpf mvvm filter prism

我一直在尝试对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();

    } 

0 个答案:

没有答案