尝试删除数据网格的选定项目时修改了集合
Collection was modified when trying to remove selected items of datagrid
按照 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
选择效果非常好。但是,当我循环删除 selected 每个项目时,我得到 "Collection was modified. Enumeration operation may not execute." 的异常。例如,我 select 3 行并按下删除键盘按钮,当我观察到我的 SelectedItems 对象时,计数按预期为 3,但在执行带有 myItems.Remove(SelectedItem) 的行后,计数立即下降到 1 .为什么会这样,我想不通,因为我不是在修改 SelectedItems,而是在修改 myItems。
PS; customdatagrid 与上面的原始 post 代码完全相同。这就是为什么我没有在这里添加它。
" i couldnt figure out because I am not modifing SelectedItems but myItems"
您正在从 myItems
中删除用作数据网格 ItemsSource
的项目。从 ItemsSource
中自动删除项目,然后将其从 SelectedItems
中删除,这种行为非常合理(当项目不再位于数据网格中时,您无法保持选中状态)。
这就是错误的原因。枚举时不能让集合发生变化。
完成此操作的一种可能方法是将所选项目复制到临时集合,例如复制到临时数组。然后枚举数组而不是原来的集合:
Dim copyOfSelectedItems(SelectedItems.Count-1) As Object
SelectedItems.CopyTo(copyOfSelectedItems,0)
For Each SelectedItem In copyOfSelectedItems
myItems.Remove(SelectedItem)
Next
在执行 foreach 循环时只需将所选项目复制到新集合,例如使用 ToArray linq 扩展方法:
For Each SelectedItem In SelectedItems.ToArray()
myItems.Remove(SelectedItem)
Next
按照 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
选择效果非常好。但是,当我循环删除 selected 每个项目时,我得到 "Collection was modified. Enumeration operation may not execute." 的异常。例如,我 select 3 行并按下删除键盘按钮,当我观察到我的 SelectedItems 对象时,计数按预期为 3,但在执行带有 myItems.Remove(SelectedItem) 的行后,计数立即下降到 1 .为什么会这样,我想不通,因为我不是在修改 SelectedItems,而是在修改 myItems。
PS; customdatagrid 与上面的原始 post 代码完全相同。这就是为什么我没有在这里添加它。
" i couldnt figure out because I am not modifing SelectedItems but myItems"
您正在从 myItems
中删除用作数据网格 ItemsSource
的项目。从 ItemsSource
中自动删除项目,然后将其从 SelectedItems
中删除,这种行为非常合理(当项目不再位于数据网格中时,您无法保持选中状态)。
这就是错误的原因。枚举时不能让集合发生变化。
完成此操作的一种可能方法是将所选项目复制到临时集合,例如复制到临时数组。然后枚举数组而不是原来的集合:
Dim copyOfSelectedItems(SelectedItems.Count-1) As Object
SelectedItems.CopyTo(copyOfSelectedItems,0)
For Each SelectedItem In copyOfSelectedItems
myItems.Remove(SelectedItem)
Next
在执行 foreach 循环时只需将所选项目复制到新集合,例如使用 ToArray linq 扩展方法:
For Each SelectedItem In SelectedItems.ToArray()
myItems.Remove(SelectedItem)
Next