【问题标题】:WPFToolkit Accordion ArgumentOutOfRangeException when removing item from ObservableCollection从 ObservableCollection 中删除项目时 WPFToolkit Accordion ArgumentOutOfRangeException
【发布时间】:2014-07-07 09:25:17
【问题描述】:

我在使用 WPFToolkit 的手风琴控件时遇到问题。该控件绑定到 ObservableCollection。当我尝试从集合初始化后添加的集合中删除项目时,我得到一个 ArgumentOutOfRangeException。仅当未选择该项目时才会发生这种情况。 这是我的代码:

private void AddNewReservation()
    {
        var res = new Reservation();
        var rvm = new ReservationViewModel(res);
        Reservations.Add(rvm);
        rvm.DeleteCommand = new RelayCommand(
            param => Reservations.Remove(rvm));
        rvm.PropertyChanged += (sender, args) => SaveReservation(res, rvm);
    }

我的目标是将包含空预订模型的 ReservationViewModel 添加到 ObesrvableCollection。只要模型/视图模型没有有效内容,就不应将其添加到存储库中。 那么我在这里做错了什么,或者这是 wpftoolkit 中的一个已知错误? 这是我的 StackTrace:

bei System.ThrowHelper.ThrowArgumentOutOfRangeException()
bei System.Collections.Generic.List`1.get_Item(Int32 index)
bei System.Collections.ObjectModel.Collection`1.System.Collections.IList.get_Item(Int32 index)
bei System.Windows.Data.ListCollectionView.InternalItemAt(Int32 index)
bei System.Windows.Data.ListCollectionView.GetItemAt(Int32 index)
bei System.Windows.Controls.ItemCollection.GetItemAt(Int32 index)
bei System.Windows.Controls.ItemCollection.get_Item(Int32 index)
bei System.Windows.Controls.Accordion.UnselectItem(Int32 index, Object item)
bei System.Windows.Controls.Accordion.ChangeSelectedIndex(Int32 oldIndex, Int32 newIndex)
bei System.Windows.Controls.Accordion.OnSelectedIndexPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
bei System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
bei System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
bei System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
bei System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
bei System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
bei System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
bei System.Windows.Controls.Accordion.set_SelectedIndex(Int32 value)
bei System.Windows.Controls.Accordion.OnItemsChanged(NotifyCollectionChangedEventArgs e)
bei System.Windows.Controls.ItemsControl.OnItemCollectionChanged2(Object sender, NotifyCollectionChangedEventArgs e)
bei System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
bei System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
bei System.Windows.Controls.ItemCollection.OnViewCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
bei System.Windows.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType)
bei System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args)
bei System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
bei System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
bei System.Windows.Data.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(NotifyCollectionChangedEventArgs args, Int32 adjustedOldIndex, Int32 adjustedNewIndex)
bei System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
bei System.Windows.Data.CollectionView.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
bei System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
bei System.Collections.ObjectModel.ObservableCollection`1.RemoveItem(Int32 index)
bei System.Collections.ObjectModel.Collection`1.Remove(T item)
bei NORDWIND_RS.ViewModel.BookingViewModel.<>c__DisplayClass17.<AddNewReservation>b__15(Object param)

如果您有任何建议,我将不胜感激,

【问题讨论】:

  • 使用相应的控件遇到同样的问题。我开始相信它有问题。就我而言,我可以删除直到最后一个项目的任何项目,但是如果我尝试从绑定集合中删除最后一个项目,则会抛出手风琴列表。

标签: c# accordion observablecollection wpftoolkit indexoutofboundsexception


【解决方案1】:

我找到了一个解决问题的方法,现在和小集合,但这不应该是这样。所以如果有人发现更好的东西,请告诉我。

private void AddNewReservation()
    {
        var res = new Reservation();
        var rvm = new ReservationViewModel(res);
        Reservations.Add(rvm);
        rvm.DeleteCommand = new RelayCommand(
            param =>
            {
                Reservations = new ObservableCollection<ReservationViewModel>(Reservations.Where(r => r != rvm));
            });
        rvm.PropertyChanged += (sender, args) => SaveReservation(res, rvm);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多