限制项目数量的ListCollectionView

时间:2019-06-11 14:04:37

标签: c# wpf

我正在尝试实现一个收集视图,该视图允许限制过滤出的项目的数量。

我想出了这个实现

public class LimitCollectionView : ListCollectionView
{
    #region CONSTRUCTOR
    public LimitCollectionView(IList source) : base(source)
    {          
    }
    #endregion

    #region FIELDS
    private int MAX_ITEMS = 0;
    #endregion

    #region PROPERTIES

    /// <summary>
    /// Gets or sets maximum amount of view items.
    /// </summary>
    public int MaxItems
    {
        get { return MAX_ITEMS; }
        set
        {
            MAX_ITEMS = value;
            OnPropertyChanged(new ComponentModel.PropertyChangedEventArgs(nameof(MaxItems)));
            RefreshOrDefer();
        }
    }

    #endregion

    #region OVERRIDES       

    /// <summary>
    /// Gets the estimated number of records.
    /// </summary>
    public override int Count
    {
        get
        {
            if (IsRefreshDeferred)
                return 0;

            if (MaxItems <= 0)
                return base.Count;        

            var baseCount = base.Count;

            if (MaxItems > baseCount)
                return baseCount;

            return Math.Min(MaxItems,baseCount);
        }
    }

    public override bool PassesFilter(object item)
    {
        if (!base.PassesFilter(item))
            return false;

        if(item!=null)
        {
            return IndexOf(item) < MaxItems;
        }

        return true;
    }

    #endregion
}

在大多数情况下,实现会按预期的方式工作,但在某些情况下,我会得到 System.InvalidOperationException:一个ItemsControl与它的项目来源不一致。

因此,我想与ItemsControl期望的内容和我的CollectionView报告的内容不一致。 所以问题是我在实现中省略了什么吗?甚至有可能实现有效的实现吗?

我知道我可以手动过滤出项目并在更改时重新创建集合,但这超出了CollectionView的目的。

0 个答案:

没有答案