У меня есть проект, который работал нормально, когда целевой .NetFramework был 3.5, но когда я изменил его на 4.6.2, я получил исключение всякий раз, когда код выполняет функцию REMOVE Коллекции.
Что я заметил когда я пытался отладить этот код до того, как был выполнен «Call.Remove ((CallVM) отправитель)», он показал, что у меня есть 2 записи в коллекции, но как только он выполняется, он говорит, что осталась 1 запись, но на самом деле в пользовательский интерфейс, он по-прежнему показывает НЕКОТОРОЙ информации из 2-й записи коллекции. Вторая запись была частично удалена. Моя цель состояла в том, чтобы удалить всю информацию о второй записи в коллекции.
Код, где происходит исключение:
void call_CancelCall(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.SelectedCall.ID) == false)
{
CTIHelper.Instance.ReleaseCall(this.SelectedCall.ID);
}
calls.Remove((CallVM)sender);
IsConsultChecked = false;
IsMakeCallChecked = false;
var activeCalls = (from c in this.calls
where c.IsConnected == true && c.IsReleased == false
select c).FirstOrDefault();
if (activeCalls != null)
{
IsConsultEnabled = true;
activeCalls.IsHoldEnabled = true;
}
OnNotifyPropertyChanged("Calls");
OnNotifyPropertyChanged("IsWorkspaceVisible");
}
А вот подробности исключения:
System.IndexOutOfRangeException was unhandled by user code
HResult=-2146233080
Message=Index was outside the bounds of the array.
Source=PresentationFramework
StackTrace:
at System.Windows.Controls.ItemContainerGenerator.RealizedItemBlock.ContainerAt(Int32 index)
at System.Windows.Controls.ItemContainerGenerator.ContainerFromIndex(Int32 index)
at System.Windows.Controls.TabControl.GetSelectedTabItem()
at System.Windows.Controls.TabControl.OnSelectionChanged(SelectionChangedEventArgs e)
at System.Windows.Controls.Primitives.Selector.InvokeSelectionChanged(List`1 unselectedInfos, List`1 selectedInfos)
at System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
at System.Windows.Controls.Primitives.Selector.RemoveFromSelection(NotifyCollectionChangedEventArgs e)
at System.Windows.Controls.Primitives.Selector.OnItemsChanged(NotifyCollectionChangedEventArgs e)
at System.Windows.Controls.TabControl.OnItemsChanged(NotifyCollectionChangedEventArgs e)
at System.Windows.Controls.ItemsControl.OnItemCollectionChanged2(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
at System.Windows.Controls.ItemCollection.OnViewCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Windows.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType)
at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args)
at System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
at System.Windows.Data.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(NotifyCollectionChangedEventArgs args, Int32 adjustedOldIndex, Int32 adjustedNewIndex)
at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
at System.Windows.Data.CollectionView.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
at System.Collections.ObjectModel.ObservableCollection`1.RemoveItem(Int32 index)
at System.Collections.ObjectModel.Collection`1.Remove(T item)
at YYY.CTI.ViewModel.winCTIBaseViewModel.call_CancelCall(Object sender, EventArgs e) in C:\Users\XXX\Desktop\ZZZ\web\ctidesktop\CTI Desktop\View Models\winCTIBaseViewModel.cs:line 4340
at YYY.CTI.ViewModel.CallVM.OnCancel(EventArgs e) in C:\Users\XXX\Desktop\ZZZ\web\ctidesktop\CTI Desktop\View Models\CallVM.cs:line 4263
at YYY.CTI.ViewModel.CallVM.Cancel() in C:\Users\XXX\Desktop\ZZZ\web\ctidesktop\CTI Desktop\View Models\CallVM.cs:line 2446
at YYY.CTI.View.Controls.CallControl.btnCancelNewCall_Click(Object sender, RoutedEventArgs e) in C:\Users\XXX\Desktop\ZZZ\web\ctidesktop\CTI Desktop\Controls\CallControl.xaml.cs:line 159
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at System.Windows.Controls.Primitives.ToggleButton.OnClick()
at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
InnerException:
Любая помощь высоко ценится. Спасибо!