3

すべてのテキスト ボックスが、 INotifyPropertyChanged を実装する同じデータ オブジェクトの異なるプロパティにバインドされているフォームがあります。form.ValidateChildren()を呼び出して明示的に検証をトリガーしたいので、フォームのAutovalidateは「無効」に設定されています。

予想: ValidateChildren を呼び出した後、編集されたすべての値がデータ オブジェクトに含まれている必要があります。

問題: 最後にフォーカスされたコントロールのみがそのデータをデータオブジェクトに書き込みますが、他のすべてのコントロールは編集された値を失い、代わりに古い値を表示します。

質問: コントロールが更新される前に、すべてのデータが検証されていることを確認するにはどうすればよいですか?

Autovalidate = EnablePreventFocusChange または EnableAllowFocusChange を使用しても機能しますが、すべてを一度に検証したいので、それは私にとって受け入れられる解決策ではありません。

インターネットで解決策を検索すると、同じ問題を示す例が見つかりましたが、残念ながら解決策はありません。

編集 さらに調査した後、私はこれを試しましたが、動作します:

form.BindingContext[dataobject].SuspendBinding();
form.ValidateChildren();
form.BindingContext[dataobject].ResumeBinding();

バインディングの一時停止は標準的な方法ですか、それともこれを修正するためのより良い解決策はありますか?

4

1 に答える 1

1

これが役立つかどうかはわかりませんが、完全な回答になるかどうかはわかりませんが、フォーム全体から1つの値のみが保存されているという同様の問題がありました。MS サイトで見つけた背景説明を次に示します。

http://connect.microsoft.com/VisualStudio/feedback/details/351146/binding-writevalue-does-not-update-underlying-data-source

SuspendBinding でさえうまくいきませんでした。リンクとそこにある情報に従って、BindingSourceオブジェクトを介してRaiseListChangeEventsプロパティをFalseに設定してオブジェクトを接続しました

Dim MyBindingSource = New BindingSource With {.DataSource = MyDataSource, .RaiseListChangedEvents = False}
MyControl.DataSource = MyBindingSource

これが配置されると、コントロールのバインディングを参照し、値を手動で書き込むことができます (バインディングが 1 つだけであると仮定します)。コードは次のようになります。

MyControl.Bindings(0).WriteValue()

これが役立つかどうか教えてください。

于 2013-10-29T15:49:18.797 に答える