たとえば、ビジネス オブジェクトがありますPerson
。
class Person : INotifyPropertyChanged
{
string Name { get; set; }
DateTime DateOfBirth { get; set; }
}
// ^ abbreviated for better legibility; implementation would be trivial
そして、このクラスのオブジェクトにデータ バインドされた Winforms UI コントロールがいくつかあります。
Person somePerson = ...;
nameTextBox.DataBindings.Add("Text", somePerson, "Name");
dobDatePicker.DataBindings.Add("Value", somePerson, "DateOfBirth");
現在、変更を行っていますが、実装somePerson
したおかげでINotifyPropertyChanged
、それらの変更が UI に反映されています。ここまでは順調ですね。
ここで私の問題:ワーカー スレッド (つまり、UI スレッドではない) に変更を加えるとsomePerson
、たとえばバックグラウンド操作として DB からデータをロードしているために、データ バインディングが更新を試みるため、例外が発生する可能性があります。コントロールは、UI スレッドでのみ発生することが許可されています。
これは、UI 要素を呼び出して、ビジネス オブジェクトを更新できるかどうかを確認する必要があることを意味します。これは、アプリケーションの論理階層化に違反しInvokeRequired
ているように思えます。
理想的には、ビジネス オブジェクトが UI にデータ バインドされているかどうかを気にせずに、ビジネス オブジェクトを変更できるようにしたいと考えています。これは、Winforms のデータ バインディングで何らかの形で可能ですか?