2016-10-05 35 views
-1

私はMVVM(C#/ WPF)アプリケーションを持っていて、バックグラウンドスレッドでViewModels(INotifyPropertyChange)とObservableCollectionsを作成して埋めたいと思っています。バックグラウンドスレッドでViewModelsおよびObservableCollectionを作成または塗りつぶすことはできますか?

私がそうするならば、私は例外を取得:「のDependencyObjectと同じスレッド上でDependencySourceを作成する必要があります。」

Dispatcherを使用してUIスレッド内のアクションを移動する方法を知っています。しかし、UIスレッドに何を移さなければならないかはわかりません。私には以下の5例があります。

  1. var vm = new ViewModel(); // implements INotifyPropertyChange
  2. vm.Name = "name"; // Fires PropertyChange
  3. var oc = new ObservableCollection<ViewModel>();
  4. oc.Add(vm);
  5. var oc2 = new ObservableCollection<ViewModel>(list); // while list is List of ViewModel
+1

は、「UIスレッドに移動しなければならないものを私に明確ではありません」。 –

+0

私はあなたが[フリーズ](https://msdn.microsoft.com/en-us/library/ms750509(v = vs.110).aspx)オブジェクトをバックグラウンドスレッドで変更する前にこれを行うことができると思います。 [この記事をチェックしてください](http://stackoverflow.com/a/26361859/1118082) –

+0

"私には次の5つのケースがあります" - その意味は何ですか?バックグラウンドスレッドを使用するコードはどこにあり、どの行がエラーをスローしていますか? – Paparazzi

答えて

1

あなたは非Dispatcherスレッド上ObservableCollection<T>.Add()を呼び出すことはできません。

あなたは非DispatcherスレッドでObservableCollection<T>を作成することができます。

コンストラクタでDispatcher -only呼び出しを持たない限り、ViewModelオブジェクトを作成するスレッドは問題ではありません。 PropertyChangedイベントに関するコメントから

更新:

あなたがそれらを処理するためにDispatcherスレッド上PropertyChangedイベントを発生する必要があります。私は、そのような状況がイベントの発生をラップするだけで、Dispatcher.Invoke()コールに役立つことがわかった。ケース固有の回答

  • ケース1のため

    更新:限り、コンストラクタで無Dispatcher固有の呼び出しなどの任意のスレッド上に置くことができます。

  • ケース2:バインドされたコントロールでイベントを処理する場合は、Dispatcherに設定してください。
  • ケース3:どのスレッドでもかまいません。
  • ケース4:Dispatcherである必要があります。
  • ケース5:どのスレッドでもかまいません。そうでない場合は例外がスローされます何もして起動します。
+0

そのため、ケース1(空のコンストラクタを使用)はディスパッチャ以外のスレッドで実行でき、ケース2はディスパッチャスレッドで実行する必要がありますか?そして、PropertyChange()はディスパッチャのみを呼び出しますか? – koalabruder

関連する問題