我有一个集合,只显示最后的 n 项目,并将其实现为循环数组。我遇到的问题是如何在添加项目时正确触发与INotifyCollectionChanged
界面相关的事件。
我的添加方法如下所示:
public void Add(T item)
{
var oldIdx = currIdx;
currIdx = (currIdx + 1) % _size; // update the index - looping if required
var old = internalArray[currIdx]; // this is the old item that will be replaced (it the array is already filled)
internalArray[currIdx] = item;
if (count < _size) // the internal array isn't filled yet...
{
count++;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
else
{
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
这样可行,但我必须使用NotifyCollectionChangedAction.Reset
来获取更新的绑定。我认为我应能够使用NotifyCollectionChangedAction.Remove
或NotifyCollectionChangedAction.Replace
,但我无法弄清楚如何使其发挥作用。如果我有类似的东西:
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, old)
我抛出异常,因为它没有索引。但我的收藏品没有索引器,所以我真的不知道它想要什么索引。我尝试了oldIdx
,currIdx
,_size - 1
,但它们都没有效果。它会抱怨我删除的项目不在该索引处。
那我该怎么做呢?删除项目然后添加新项目(或替换项目)以及何时应该触发事件的步骤的正确顺序应该是什么?它究竟想要什么指数?