尝试删除数据网格的选定项时修改了集合

时间:2015-04-16 12:43:28

标签: wpf vb.net mvvm wpfdatagrid

通过跟随this answer,我的编码方式几乎相同。以下是我的代码的一部分。

XAML绑定:

<cst:CustomDataGrid x:Name="grdItems"   ItemsSource="{Binding myItems, IsAsync=True}"   SelectedItemsList="{Binding SelectedItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"                            

视图模型:

   Protected Overrides Sub DeleteCurrent()
        Dim msg As New UserMessage()
        If SelectedItems IsNot Nothing Then
            For Each SelectedItem In SelectedItems
                  myItems.Remove(SelectedItem)
            Next

            RaisePropertyChanged("Items")

        End If

    End Sub


Private m_myItems As ObservableCollection(Of item)
    Public Property myItems() As ObservableCollection(Of item)
        Get
            Return m_myItems
        End Get
        Set(value As ObservableCollection(Of item))
            m_myItems = value
        End Set
    End Property


    Private m_SelectedItem As IList = New List(Of item)()
    Public Property SelectedItems() As IList
        Get
            Return m_SelectedItem
        End Get
        Set(value As IList)
            m_SelectedItem = value
            '   RaisePropertyChanged("SelectedItems")
        End Set
    End Property

选择完美无缺。但是当我循环删除选中的每个项目时,我得到的异常是“收集被修改。枚举操作可能无法执行。”。例如,我选择3行并按下删除键盘按钮,当我观察我的SelectedItems对象时,count是预期的3,但在执行myItems.Remove(SelectedItem)行后,count减少到1.为什么会发生这种情况,我无法弄清楚因为我没有修改SelectedItems而是myItems。

PS; customdatagrid与上面的原始帖子完全相同。这就是为什么我没有在这里添加它。

2 个答案:

答案 0 :(得分:2)

在进行foreach循环时只需将选择项复制到新集合中,例如使用ToArray linq扩展方法:

For Each SelectedItem In SelectedItems.ToArray()
    myItems.Remove(SelectedItem)
 Next

答案 1 :(得分:1)

  

&#34;我无法弄明白,因为我没有修改SelectedItems但是myItems&#34;

您要从myItems中删除用作数据网格ItemsSource的项目。从ItemsSource自动删除项目,然后将其从SelectedItems中移除,这种行为非常有意义(当数据不再位于数据网格中时,您无法选择该项目。)

这就是错误的原因。在枚举时,您无法更改集合。

实现此目的的一种可能方法是将所选项目复制到临时集合,例如复制到临时数组。然后枚举数组而不是原始集合:

Dim copyOfSelectedItems(SelectedItems.Count-1) As Object
SelectedItems.CopyTo(copyOfSelectedItems,0)
For Each SelectedItem In copyOfSelectedItems
      myItems.Remove(SelectedItem)
Next