ListView:NotifyCollectionChangedEventHandler始终引发ArgumentOutOfRangeException

时间:2018-08-08 18:02:43

标签: c# uwp

我有一个ListView控件,它使用实现ListView.ItemsSource / ISupportIncrementalLoading的集合类来异步加载(通过设置INotifyCollectionChanged)。

当我尝试调用INotifyCollectionChanged事件订阅者时,我得到ArgumentOutOfRangeException此集合无法使用大于Int32.MaxValue-1(0x7FFFFFFF-1)的索引。 n参数名称:索引” 异常。

我几乎尝试了NotifyCollectionChangedEventArgs构造函数的每个重载。无论我做什么,我总是会遇到同样的异常。 我传递给事件处理程序的NotifyCollectionChangedEventArgs对象没有看到任何错误。

有什么想法吗?

public class GroupDataSource<T> : ObservableCollection<T>,
     INotifyCollectionChanged,                  
     ISupportIncrementalLoading  where T : SDataEntity, new()
{
        ...
        async Task NotifyOfInsertedItems(int baseIndex, int count)
        {
                        await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                            () =>
                            {
                                foreach (NotifyCollectionChangedEventHandler handler in _eventHandlers)
                                {
                                    for (int i = 0; i < count; i++)
                                    {
                                        var args = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, _items[i + baseIndex], i + baseIndex);
                                        try
                                        {
                                            handler(this, args);
                                        }
                                        catch(Exception e)
                                        {
                                            //todo: log it
                                            //this is where I get System.ArgumentOutOfRangeException
                                        }
                                    }
                                }
                            }
                            );
                    }

        public IAsyncOperation<LoadMoreItemsResult>LoadMoreItemsAsync(uint count)
        {

                        return Task.Run<LoadMoreItemsResult>(
                            async () =>
                            {
                                    //skipped - asynchronously load data

                                    int baseIndex = _items.Count;
                                    lock (_items)
                                    {
                                        _items.AddRange(newResults);
                                    }
                                    await NotifyOfInsertedItems(baseIndex, newResults.Count);

                                    return new LoadMoreItemsResult() { Count = (uint)newResults.Count };
                                }

                            }).AsAsyncOperation<LoadMoreItemsResult>();
                    }
        }

enter image description here

1 个答案:

答案 0 :(得分:1)

对于它的价值而言,在我从List<T>而不是ObservableCollection<T>派生类之后,问题就消失了。