Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制项目数量的ListCollectionView_C#_Wpf - Fatal编程技术网

C# 限制项目数量的ListCollectionView

C# 限制项目数量的ListCollectionView,c#,wpf,C#,Wpf,我正在尝试实现一个集合视图,该视图允许限制筛选出的项目的数量 我提出了这个实现 public class LimitCollectionView : ListCollectionView { #region CONSTRUCTOR public LimitCollectionView(IList source) : base(source) { } #endregion #region FIELDS private i

我正在尝试实现一个集合视图,该视图允许限制筛选出的项目的数量

我提出了这个实现

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
}
公共类LimitCollectionView:ListCollectionView { #区域构造函数 public LimitCollectionView(IList源代码):基本(源代码) { } #端区 #区域字段 私有整数最大项=0; #端区 #区域属性 /// ///获取或设置视图项的最大数量。 /// 公共整数最大项 { 获取{return MAX_ITEMS;} 设置 { 最大项目=价值; OnPropertyChanged(新组件模型.PropertyChangedEventArgs(名称)(MaxItems)); RefreshOrDefer(); } } #端区 #区域覆盖 /// ///获取估计的记录数。 /// 公共覆盖整数计数 { 得到 { 如果(IsRefreshDeferred) 返回0; if(MaxItems baseCount) 返回基本计数; 返回Math.Min(MaxItems,baseCount); } } 公共覆盖布尔PassesFilter(对象项) { 如果(!base.PassesFilter(项目)) 返回false; 如果(项!=null) { 返回(项) 在大多数情况下,实现按预期工作,但在某些情况下,我得到 System.InvalidOperationException:ItemsControl与其项源不一致

因此,我认为ItemsControl期望的内容与我的CollectionView报告的内容不一致。 所以问题是我在实现中是否遗漏了一些东西?甚至有可能有一个有效的实现吗


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

“在某些情况下,我会得到System.InvalidOperationException”--哪些情况?我想可能是您在阅读集合时更改了集合,也许可以尝试一下这里的建议并启用CollectionSynchronization是关于虚拟化的吗?为什么您认为子类化
ListCollectionView
是一个好主意?collection视图有一个可观察的集合作为源,并确保在其上使用EnableCollectionSynchronization,因此不应存在竞争条件@Sinatr我不知道这是否是一个好主意,但这是一个要求。“在某些情况下,我得到System.InvalidOperationException”--哪种情况?我想也许你在阅读时正在更改集合,也许可以尝试这里的建议并启用集合同步是关于虚拟化的吗?为什么您认为子类化
ListCollectionView
是一个好主意?collection视图有一个可观察的集合作为源,并确保在其上使用EnableCollectionSynchronization,因此不应存在竞争条件@Sinatr我不知道这是不是一个好主意,但这是一个要求。