2012-03-16 41 views
7

ObservableCollectionに追加されたアイテムを拒否できるようにしたいと考えています。 ObservableCollectionをサブクラス化することはできません。また、あらゆる種類のビューを使用することができます。禁止された項目に対して.Remove()を実行するために定義されたイベントハンドラ(CollectionChanged)を使用することに限定されているようです。イベントが発生してから処理されるまでの短い期間にアイテムが存在する場合は問題ありません。項目はコレクション内に残ってはいけません。 CollectionChangedイベントハンドラ内の.Remove()の呼び出しは許可されていないようです。実行時に.NETがInvalidOperationExceptionをスローします。CollectionChangedイベントハンドラのObservableCollectionからアイテムを削除する

"CollectionChangedイベント中にObservableCollectionを変更できません。

個人的に私は.NETが私にできると思う。私が無限ループを作成すると、それは私自身の駄目です。

私が使用したいコードは次のようになります。私は私が持っているもののオプションわからない

myCollection.CollectionChanged += (sender, args) => 
{ 
    if (args.Action == NotifyCollectionChangedAction.Remove) 
     return; 
    foreach (var itm in myCollection) 
    { 
     if (itm.name == "Fred") 
      myCollection.Remove(itm); 
    } 
} 

。ディスパッチャを使用しても動作しないようです。別のイベントをトリガし、.Removeコールを別のハンドラに配置することは、唯一の選択肢です。

+0

ObservableCollectionからアイテムを削除することはできません。それが1つのポイントです...あなたは、それがラッピングしているコレクションからアイテムを削除することしかできません。 –

+0

コレクション変更イベントハンドラでは実行しないでください。代わりに、コレクションを変更する前にフィルタを実行します。適切な変更でなければコレクションを変更できません。 –

+0

私はこれが古く、おそらくそれを行うための「正しい」方法ではないことを知っています。それは私がしたことであり、誰かを助けるかもしれない。 OberservableCollectionから選択したファイルを削除しようとしていたときに、その例外を取得するのと同じ問題が発生しました。 Messengerで2番目のファイルの削除要求が処理されていたときに、CollectionChangeイベントが発生していました。だから私のCollectionChangedイベントハンドラで、 'lock(this.Files){//イベントのコード} 'を追加しなければならなかった。私はこれをやって、プログラムをやり直し、複数のファイルを選択して削除した。今回は例外なく、削除は待たなければならなかったからです。 – famousKaneis

答えて

16

チェックアウトCommon Mistakes using Observable Collection

は、あなたがまだこのルートを移動したい場合は、と言った - あなたは本当にあなたがコレクションのコピーを反復処理したいしようとしているコレクションを変更したい場合は、new Thread

11

を回転することができます。その理由は、あなたが悲しみを引き起こすforeachループのコレクションを変更しようとしているからです。言っ

var copy = new ObservableCollection<YourType>(collection) 
foreach(var item in copy) 
{ 
    if(item.Name == "Fred") 
    { 
     collection.Remove(item); 
    } 

} 

の例では、私はあなたがて、CollectionChangedイベント内のObservableCollectionに事のこのタイプを行うと、確かにすべきではないことをアヌラーグに同意します。

0

リストを反復するためにToList()を使用してください。

foreach(var item in collection.ToList()) 
{ 
    if(item.Name == "Fred") 
    { 
     collection.Remove(item); 
    } 
} 
関連する問題