16

CollectionChanged関連付けられているイベントがありObservableCollectionます。次に、このCollectionChangedイベントは、別のコレクション (同じ型の) を元のコレクションのアイテムで更新するための別の関数を呼び出します。「 CollectionChanged イベント中に ObservableCollection を変更できない」に関する他の投稿を読んだことがありますが、イベント内でコレクションを変更することが嫌われている理由と、これが循環参照になる可能性がある理由を完全に理解していCollectionChangedます...しかし、この特定のケースでは元のコレクションを変更するのではなく、そこから無関係なコレクションにアイテムを追加するだけです。

だから私の質問に..私がやっていることに何か問題がありますか? イベントが関連付けられたコレクションからアイテムを別のコレクションに追加すると、イベントが再び発生し、循環参照が作成される方法がわかりません(ただし、これについて間違っている場合は教えてください)。

また・・・何か方法はありますか?これを別のスレッドで実行するようにアドバイスするいくつかの投稿を読みましたが、それを試みると、代わりに次のエラーが発生します。

This type of CollectionView does not support changes to its SourceCollection
from a thread different from the Dispatcher thread.

私は本当にここで何が起こっているのかをよりよく理解した後です。アドバイスをいただければ幸いです。

編集

要求に応じた簡略化された例

void originalCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    update(originalCollection);
}

private void update(object parameter)
{
    foreach (var originalCollectionItem in parameter)
        newCollection.Add(originalCollectionItem);
}
4

1 に答える 1

7

WindowsForms を使用している場合は、必ずフォームで Invoke メソッドを使用して、実行中のコードを Dispatcher のスレッドに保持してください。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.invoke.aspx

または、WPF を使用している場合は Dispatcher クラスを使用します。

http://dotnetpattern.com/wpf-dispatcher

于 2013-06-06T17:50:23.780 に答える