2011-10-03 6 views
0

Observableコレクションオブジェクトがあり、その値は自分のコードから更新しています。このコレクションは、データグリッドと双方向で結びついています。今コレクションのスレッドセーフです。つまり、コードからコレクションの値を変更しようとすると同時に、ユーザーが(データグリッドを編集した結果として)変更しようとすると、プログラムが例外?はいの場合は、これを避ける方法を教えてください。オブジェクトをWPFコントロールのスレッドセーフにバインドする方法

おかげで...

答えて

1

これは、重複hereのように見える、とhereしかし短い答えは、あなたがプロパティを変更している場合は、安全だということです。

コレクションを使用しているので、UIスレッドだけでなく、複数のスレッドでObservableCollectionを変更しようとすると、もう少し処理が必要になります。これは多くカバーされており、this linkまたはthis one

のいずれかでチェックアウトできますが、UIスレッド内で変更を行っている場合は、ObservableCollectionが意図しているとおり安全です。 Dispatcher.BeginInvoke()で適切にマーシャリングしている限り、イベントはUI上で作成され、処理されます。

+0

私はDispatcher.BeginInvokeメソッドを使用して、UIスレッドのobservableコレクションを更新しています。つまり、ユーザーがデータグリッドを編集すると、Observableコレクションでロックが取得され、Dispatcher.BeginInvokeを使用して呼び出すメソッドが完了するまで待機します。 – Manoj

+0

Dispatcher.BeginInvokeを使用してUIスレッドに作業をマーシャリングする@Manojは問題ありません。問題は**あなたが別のスレッドでコレクションを変更しようとすると発生しますが、私はあなたがやっていることを信じていません。私は自分の理解を確認するつもりですが、わかっている限り、それ自体は「ロック」ではなく、NotifyCollectionChangedイベントを作成しています。このイベントは、そのようなイベントのキューに追加されます。コレクションの新しい内容で自分自身を更新します – Kevek

+0

@Manojこれは私が狂っていないことを私に確信しています: "ObservableCollectionが変更されると、イベントが発生します。スレッドが変更された場合AddまたはRemoveメソッドが返される前にハンドラが完了するため、[this link](http://updatecontrols.net/doc)のバックグラウンドスレッドでObservableCollectionを変更することはできません。/tips/common_mistakes_observablecollection)ページの下の約4分の3。 – Kevek