3

ここに画像の説明を入力

私の送信フォームは、bindingSource1 を介して送信ビューモデルにバインドされています。

私が期待したこと:編集時に、UI 値を ViewModel に割り当てたくありません。「送信」ボタンが押された後にのみ値が ViewModel に割り当てられるようにし、UI 値が検証されたら、 を呼び出しますbindingSource.EndEdit();。それまでに、UI 値を ViewModel に書き込む必要があります。

私が経験したこと:私の理解は真実ではないと思います。テキストフィールドを編集した後、そのテキストボックスまたはコンボボックスへのフォーカスを失うとすぐに、「キャンセル」または [x] 閉じるボタンを押しても問題にならないような方法で変更が記憶されます。このフォームが閉じられると、値がメモリ内の ViewModel に割り当てられるようになりました。(もちろん、「送信」を押していないので、すべての IO ロジックを経由していません)

「キャンセル」/[x] 編集を閉じるときに、bindingSource が不要な変更を破棄するようにします。どうすればいいですか?

4

1 に答える 1

2

デフォルトでは、データ バインディングは、検証イベントで基になるデータ ソースを更新します。デフォルトでは、コントロールを離れると検証イベントが発生します。ただし、どちらの動作もカスタマイズできます。

データバインディングでキャンセルを実装する方法については、この回答を参照してください。自動データ バインディング更新を一時停止してから、手動で強制的に更新しますSubmit

別の方法として、コントロールを設定することもできCausesValidation = Falseます。次に、Cancelボタンにフォームを閉じてもらい、次のSubmitようなことを行います。

control1.CausesValidation = True
control2.CausesValidation = True
control3.CausesValidation = True
Me.ValidateChildren()
control1.CausesValidation = False
control2.CausesValidation = False
control3.CausesValidation = False

本番環境で使用するために上記のアプローチを使用することにした場合は、コントロールを 1 回 (たとえば、 内でForm_Load) 列挙し、データ バインドされているものを収集します。次に、それらをループで簡単に実行して、または のCausesValidationいずれかTrueに設定できますFalse。または、これを行うヘルパー メソッドを用意して、他のフォームで再利用します。

于 2012-12-24T02:21:51.803 に答える