我有一个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>();
}
}
答案 0 :(得分:1)
对于它的价值而言,在我从List<T>
而不是ObservableCollection<T>
派生类之后,问题就消失了。