使用循环数组集合实现INotifyCollectionChanged

时间:2017-01-23 18:26:12

标签: c# arrays wpf

我有一个集合,只显示最后的 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.RemoveNotifyCollectionChangedAction.Replace,但我无法弄清楚如何使其发挥作用。如果我有类似的东西:

CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, old)

我抛出异常,因为它没有索引。但我的收藏品没有索引器,所以我真的不知道它想要什么索引。我尝试了oldIdxcurrIdx_size - 1,但它们都没有效果。它会抱怨我删除的项目不在该索引处。

那我该怎么做呢?删除项目然后添加新项目(或替换项目)以及何时应该触发事件的步骤的正确顺序应该是什么?它究竟想要什么指数?

0 个答案:

没有答案