尝试删除选定的datagrid项时修改了集合 [英] Collection was modified when trying to remove selected items of datagrid
问题描述
通过遵循此答案,我以几乎相同的方式进行了编码.下面是我的代码的一部分.
by following this answer I coded almost same way. Below is part of my code.
XAML绑定:
<cst:CustomDataGrid x:Name="grdItems" ItemsSource="{Binding myItems, IsAsync=True}" SelectedItemsList="{Binding SelectedItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ViewModel:
ViewModel:
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行并按Delete键,当我观察到我的SelectedItems对象时,count为预期的3,但是在执行myItems.Remove(SelectedItem)行之后,count下降为1.为什么会这样,我无法弄清楚,因为我不是在修改SelectedItems,而是myItems.
Selection works perfectly fine. But when I am looping to remove selected each item, I am getting exception that "Collection was modified. Enumeration operation may not execute.". For example, I select 3 rows and press delete keyboard button, when I observe my SelectedItems object, count is 3 as expected but right after executing the line with myItems.Remove(SelectedItem), count goes down to 1. why is that happening, i couldnt figure out because I am not modifing SelectedItems but myItems.
PS;customdatagrid与上面的原始帖子完全相同的代码.那就是为什么我没有在这里添加它.
PS; customdatagrid is exactly same code as the original post above. thats why i didnt add it here.
推荐答案
在执行foreach循环时,只需将选定的项目复制到新集合中即可,例如使用ToArray linq扩展方法:
just copy selecteditems to new collection when doing foreach loop, e.g using ToArray linq extension method:
For Each SelectedItem In SelectedItems.ToArray()
myItems.Remove(SelectedItem)
Next
这篇关于尝试删除选定的datagrid项时修改了集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!