2015-04-16 2 views
0

по следующему this answer Я кодировал почти такой же путь. Ниже приведена часть моего кода.Коллекция была изменена при попытке удалить выбранные элементы данных datagrid

XAML связывания:

<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 

Выбор отлично работает. Но когда я зацикливаюсь, чтобы удалить выбранный элемент, я получаю исключение, что «Collection был изменен. Операция перечисления может не выполняться». Например, я выбираю 3 строки и нажимаю кнопку удаления кнопки, когда я наблюдаю свой объект SelectedItems, количество равно 3, как и ожидалось, но сразу после выполнения строки с myItems.Remove (SelectedItem) счет уменьшается до 1. Почему это происходит, я не мог понять, потому что я не изменяю SelectedItems, но myItems.

PS; customdatagrid - это точно такой же код, как и исходное сообщение выше. вот почему я не добавил его здесь.

ответ

1

просто скопировать SelectedItems новой коллекции при выполнении цикла Еогеаспа, например, с использованием ToArray методы расширения LINQ:

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

ToArray не доступен для коллекций. Ilist, но я понял, как использовать toarray. Таким образом, кастинг был сначала необходим. Для каждого выбранного элемента в выбранных тегах. (Из пункта) .ToArray() myItems.Remove (SelectedItem) Далее – batmaci

1

«я не мог понять, потому что я не SelectedItems но необходимости модифицировать 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 
Смежные вопросы