首页 > 解决方案 > 是否可以过滤 ICollectionView 以仅显示子级而不是整个层次结构?

问题描述

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

    } 

标签: c#wpfmvvmfilterprism

解决方案


推荐阅读