3

如何从 silverlight 中的 observablecollection 中删除多个项目。在我的项目中,我有一个数据网格填充多个项目。在每一行中也包含一个复选框。如果我通过选择复选框选择多个行并单击删除按钮,我想从集合中删除所有项目。

public void delete(object parameter)
    {
      foreach (var x in Book)
        {
              if (x.Ischeck == true)
                 {
                    Book.Remove(x);
                  }
         }
     } 

它会导致错误。无法更改 observablecollection

4

3 回答 3

16

您可以改用下面提到的代码片段:

foreach (var x in Book.ToList())
{
    if (x.Ischeck)
    {
        Book.Remove(x);
    }
}

或者

for (int i = Book.Count - 1; i >= 0; i--)
{
    if (Book[i].Ischeck)
    {
        Book.RemoveAt(i);
    }
}
于 2012-11-20T11:40:29.633 回答
6

我认为错误消息有点不同。更准确地说,它是:

收藏已修改;枚举操作可能无法执行。

要解决此问题,一种可能的解决方案是:

foreach (var itemToRemove in Book.Where(x => x.Ischeck).ToList())
{
    Book.Remove(itemToRemove);
}

这将获取您要删除的所有项目并将它们放入新列表中。现在,当您从中删除项目时,Book不会干扰您当前正在迭代的列表,因为这是一个独立的实例。

Where在调用之前使用ToList可以将您复制到新列表的引用数量减少到只有那些真正需要复制的引用。

于 2012-11-20T11:38:49.107 回答
1

只需获取首先包含的对象的列表:

public void delete(object parameter)
{
    foreach (var x in Book.ToList())
    {
        if (x.Ischeck == true)
        {
            Book.Remove(x);
        }
    }
} 

这样做的原因是在枚举元素时不能从 observable 集合中删除元素。通过调用 ToList() 您首先枚举整个集合,将其存储在列表中,然后检查要删除的内容。

于 2012-11-20T11:38:46.320 回答