ここでサンセットテクノロジーを使用していることはわかっていますが、それでも問題の解決策を見つけたいと思います。
いくつかの単純なフィールドを持つエンティティがあります。このようなフォームにテキストボックスをバインドできます
nameTextBox.DataBindings.Add(new Binding("Text", entity, "Name"));
日付フィールドについても同じことをしました。
evaluationDatePicker.DataBindings.Add(new Binding("Value", entity, "EvaluationDate"));
また、EvaluationDateプロパティのタイプがDateTimeである限り、これも正常に機能します。
ただし、エンティティを変更してEvaluationDateをnull許容にすると、バインディングは一方向になります。つまり、コントロールはプロパティ値を反映しますが(nullでない限り)、UIで別の日付を選択してもエンティティは更新されません。
例外をスローせず、失敗した場合でもすべてがうまくいくふりをするという最近のWindowsフォームポリシーに沿って(私の本では大きな迷惑です。Form_Loadも例外を飲み込むだけですが、この場合はもちろん、以前のForm_Loadをはるかに超えています。エラーが発生します)。したがって、実際には、それが何かをしようとしているかどうかさえわかりませんが、プロパティがnull許容でない限り、双方向バインディングが完全に正常に機能していることを考えると、そうだと想定する必要があります。
どうすればこれを克服できますか?
私がやろうとしているのは、単純な命名規則に基づいてコントロールをデータバインドする機能を備えた、アプリケーションのプレゼンター用の基本クラスを作成することです。プレゼンターは、TextBoxの場合はTextプロパティをバインドし、CheckBoxの場合は「Checked」をバインドする必要があることを知っています。プロパティとコントロール間のマッピングは慣例により行われます。フィールドを表示するコントロールは、フィールドにコントロールタイプを加えたものと同じ名前にする必要があります。したがって、TextBoxに表示される「Name」は「NameTextBox」にマップされます(これはとにかく使用するのが好きな規則です。なぜ人々が特にGUIコントロールを備えたプレフィックスを好むのか理解できませんが、他の種類のコードはありません!?)チェックボックスの「IsMarried」は「IsMarriedCheckBox」になります。
これらすべてにより、プレゼンターは、オブジェクト「データソース」と、バインドされるコントロールが存在するコンテナーを受け入れるメソッドを提供できます。これにより、バインディングソースを使用してコードを記述する必要がある場合と比較して、画面に多数のフィールドを追加する作業が非常に迅速になります。私のようなソリューションでは、コンパイラチェックが行われず、タイプミスやプロパティの名前変更によって簡単に壊れることがあります。
しかし、私の小さなPoCを作成するには、これで何を処理できるのか、そしてどのようなものでも他のソリューションが必要になるのかを知りたいと思います。null許容型のプロパティをサポートできれば、それらを頻繁に使用するため、全体としてかなり価値があります。(また、それらの使用をやめたくありません。「値がある」という概念をまとめると、「どの値」がエレガントで、コードが少なくなり、コンパイラーのヘルプが増えます。)
方法はありますか?私が引っ掛けることができるものは何ですか?または、Nullable <T>を置き換えるために独自の汎用タイプを作成することは可能ですか?何もしなくてもうまくいかない理由がわからないので、何をやってみる価値があるのか想像がつきません。