Search code examples
wpfvb.netmvvmwpfdatagrid

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 binding:

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

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

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 is exactly same code as the original post above. thats why i didnt add it here.


Solution

  • 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