我正在尝试实现一个收集视图,该视图允许限制过滤出的项目的数量。
我想出了这个实现
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的目的。