3

Silverlightのobservablecollectionから複数のアイテムを削除するにはどうすればよいですか?私のプロジェクトでは、1つのデータグリッドに複数のアイテムが入力されています。すべての行に1つのチェックボックスも含まれています。チェックボックスを選択して削除ボタンをクリックして複数の行を選択した場合は、コレクションからすべてのアイテムを削除します。

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

エラーメッセージは少し違うと思います。より正確には、次のとおりです。

コレクションが変更されました。列挙操作が実行されない場合があります。

この問題を回避するための1つの可能な解決策は、次のとおりです。

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);
        }
    }
} 

これは、要素を列挙している間は、監視可能なコレクションから要素を削除できないためです。ToList()を呼び出すことにより、最初にコレクション全体を列挙し、それをリストに格納してから、何を削除するかを確認します。

于 2012-11-20T11:38:46.320 に答える