[Error] As Stringのプロパティを実装し、エラーがある場合はエラーメッセージを、エラーがない場合はNothingを返す様にする。
基本的には実装しない。ただ、IDataErrorInfo.ErrorInfoItemが単なるReturn Nothing出ない場合は、実装する価値がある。
実装することのメリットは、ErrorProviderをバインドすることで、IDataErrorInfo.Errorにより勝手にバルーンがでること。
まず、ダイアログロード時に最初にDeepコピーを作り、それをバインドする(DeepCopyToメソッドを実装してく)。
表示値(Deepコピーされた値の、プログラムからの変更は、まずDeepコピーされたインスタンスのプロパティを変更し、その後BindingSource.ResetCurrentItem()を実行して、画面の表示を更新する)
バインドするときは、OnPropertyChangedでバインドするとよい(すると、Errorプロパティをラベルとバインドするとき、Errorがすぐに更新される)。INotifuChangedの実装は不要。
ただ、例えばTextBoxに数値型をバインドすると、デフォルトではロストフォーカスできなくなる。これを回避するには以下を行う。
ダイアログのLoad時にMe.AutoValidate = EnableAllowfacusChangeとする
OnClosingをオーバーライドし、e.Cancel = Falseの1文を加える(Closeできなくなる現象を防ぐため)
但し、TextBoxにString型、もしくはNumericUpDwonにDouble型をバインドするのみの場合は、これらは不要
参考 : http://msdn.microsoft.com/ja-jp/library/ms229603
もし、IDatqaErrorInfoを実装していれば(もしくはテキストボックスに数値型をバインドするときは)、ErrorProviderをバインドする。
最後、OKボタンが押されたときに、ValidateChildrenを確認しIDataErrorInfoを実装しているときは、さらにErrorInfoItemを確認する。
もしOKなら、ShallowCopyToメソッドを使って、オリジナルのインスタンスに、ダイアログにバインドされているインスタンスの内容を書き込む。