Я добавляю к наблюдаемой коллекции в альтернативном потоке, и эта коллекция связана с сеткой данных из wpftoolkit.
Когда происходит такое событие, oncollectionoted вызывается через основной поток графического интерфейса.
Проблема, которую я вижу, заключается в том, что большую часть времени приложение будет выдавать:
System.ArgumentOutOfRangeException было не обработано
Сообщение = Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции.
Имя параметра: индекс
Источник = mscorlib
ParamName = индекс
Трассировки стека:
в System.ThrowHelper.ThrowArgumentOutOfRangeException ()
в System.Collections.Generic.List 1.get_Item(Int32 index)
at System.Collections.ObjectModel.Collection
1.System.Collections.IList.get_Item (Int32 index)
в System.Windows.Data.ListCollectionView.InternalItemAt (индекс Int32)
в System.Windows.Controls.VirtualizingStackPanel.CleanupContainers (Int32 firstViewport, ItemsControl itemsControl)
в System.Windows.Controls.VirtualizingStackPanel.MeasureOverride (ограничение размера)
в Microsoft.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride (ограничение размера) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ Примитивы \ DataGridRowsPre: 109
в System.Windows.FrameworkElement.MeasureCore (Доступный размер)
в System.Windows.UIElement.Measure (Доступный размер)
в System.Windows.ContextLayoutManager.UpdateLayout ()
в System.Windows.ContextLayoutManager.UpdateLayoutCallback (Object arg)
в System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks ()
в System.Windows.Media.MediaContext.RenderMessageHandlerCore (Object resizedCompositionTarget)
в System.Windows.Media.MediaContext.RenderMessageHandler (Object resizedCompositionTarget)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler)
в System.Windows.Threading.DispatcherOperation.InvokeImpl ()
в System.Threading.ExecutionContext.runTryCode (объект userData)
в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (код TryCode, код возврата CleanupCode, объект userData объекта)
в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта)
в System.Windows.Threading.DispatcherOperation.Invoke ()
в System.Windows.Threading.Dispatcher.ProcessQueue ()
в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled)
в MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler)
в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, время ожидания TimeSpan, метод Delegate, аргументы объекта, логическое значение isSingleParameter)
в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в MS.Win32. UnsafeNativeMethods.DispatchMessage (MSG & msg)
в System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage (MSG & msg)
в System.Windows.Threading.Dispatcher.PushFrameImpl (фрейм DispatcherFrame)
в System.Windows.Application.RunInternal (окно окна)
в Apollo.App.Main () в F: \ Workspaces \ BVS \ BVS \ Apollo \ Apollo \ obj \ Debug \ App.g.cs: строка 0
Есть мысли о том, откуда это может быть?Вот онколлекционный измененный код:
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
using (BlockReentrancy())
{
KeyValuePair<NotifyCollectionChangedEventHandler, CollectionChangedEventData>[] handlers = _collectionChangedHandlers.ToArray();
if (handlers.Length > 0)
{
foreach (KeyValuePair<NotifyCollectionChangedEventHandler, CollectionChangedEventData> kvp in handlers)
{
if (kvp.Value.Dispatcher == null)
{
kvp.Value.Action(e);
}
else
{
kvp.Value.Dispatcher.Invoke(kvp.Value.Action, DispatcherPriority.DataBind, e);
}
}
}
}
}