Я получаю это исключение, когда запуская событие CollectionChanged на пользовательскую реализации INotifyCollectionChanged:System.InvalidOperationException «п» индекс в случае изменения коллекции не является действительным для сбора размера «0»
Исключения из «System.InvalidOperationException» типа произошло в PresentationFramework.dll, но не был обработан в пользовательском коде
Дополнительная информация: индекс «25» в случае изменения коллекция не действительна для сбора размера «0».
XAML Datagrid привязан к коллекции как ItemsSource.
Как избежать этого исключения?
Код следующим образом:
public class MultiThreadObservableCollection<T> : ObservableCollection<T>
{
private readonly object lockObject;
public MultiThreadObservableCollection()
{
lockObject = new object();
}
private NotifyCollectionChangedEventHandler myPropertyChangedDelegate;
public override event NotifyCollectionChangedEventHandler CollectionChanged
{
add
{
lock (this.lockObject)
{
myPropertyChangedDelegate += value;
}
}
remove
{
lock (this.lockObject)
{
myPropertyChangedDelegate -= value;
}
}
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
var eh = this.myPropertyChangedDelegate;
if (eh != null)
{
Dispatcher dispatcher;
lock (this.lockObject)
{
dispatcher = (from NotifyCollectionChangedEventHandler nh in eh.GetInvocationList()
let dpo = nh.Target as DispatcherObject
where dpo != null
select dpo.Dispatcher).FirstOrDefault();
}
if (dispatcher != null && dispatcher.CheckAccess() == false)
{
dispatcher.Invoke(DispatcherPriority.DataBind, (Action)(() => this.OnCollectionChanged(e)));
}
else
{
lock (this.lockObject)
{
foreach (NotifyCollectionChangedEventHandler nh in eh.GetInvocationList())
{
nh.Invoke(this, e);
}
}
}
}
}
Ошибка возникает в следующей строке:
nh.Invoke(this, e);
Спасибо!