Я пытаюсь реализовать представление коллекции, позволяющее ограничить количество отфильтрованных элементов.
Я придумал эту реализацию
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.