プロパティ値がワーカースレッド(非UI)から更新された場合、データバインディングを使用してプロパティの変更をリッスンしているコントロールに反映されますか?WPFデータバインディングスレッドは安全ですか?
ありがとうございます。
プロパティ値がワーカースレッド(非UI)から更新された場合、データバインディングを使用してプロパティの変更をリッスンしているコントロールに反映されますか?WPFデータバインディングスレッドは安全ですか?
ありがとうございます。
WPFはDispatcherを使用しているため、すべてのUIスレッドで作業が行われますが、スイッチの同時実行性はあります。また、依存オブジェクトの一部を更新すると、実際には新しいジョブがディスパッチャキューにポストされます。そのジョブが実行されると、UIスレッドで実行され、コントロールが適切に更新されます。 しかし、バックグラウンドスレッドから直接コントロールにアクセスしようとすると例外が発生します。
この実装のために特定のエッジケースがあります。例えば。 UIスレッドのプロップを更新しても、コントロールが自動的にそれを更新して変更を反映することは期待できません。このような
<TextBox x:name="tb" Text="{Binding Text"}/>
とコード::あなたはこのようなXAMLを持っているのであれば、更新は次のタスクにディスパッチャを経由して行く可能性があるため、
var model = new { Text = "aaa" };
tb.DataContext = model;
model.Text = "bbb";
Debug.Assert(tb.Text == "bbb");
アサーションは、失敗することがあります。この現在の呼び出しが終了し、制御がディスパッチャーに返されるまで、更新されません。
はい、そうです。 WPFデータバインディングを使用する主な利点の1つは、実際には、この厳密なシナリオを実装することを簡単にすることです。
ObservableCollectionコレクションの変更通知はスレッドセーフではありません(コレクションの更新を手動でUIスレッドに委任する必要があります)。 –