WPFのTextBox(LostFocus、LostKeyBoardFocusなど)からモデルを更新するために使用するイベントはどれですか? WPFでイベントの優先順位を設定する方法は?
-
10-10-2019 - |
質問
私は、多くのテキストボックスと、Save、Saveasなどのようないくつかのボタンがあるアプリケーションを持っています。
ユーザーがテキストボックスを編集するとき、データベースの範囲を確認し、範囲を検証し、データベースを更新する必要があります。ユーザーが入力した値にエラーがある場合は、テキストボックスがフォーカスを失うことを許可してはなりません。
LostFocusイベントを使用していました このため、最近までうまく機能していたので、アプリケーションでバグを発見しました。
バグ : ユーザーはテキストボックスで値を編集し、[保存]ボタンをクリックします。 LostFocusイベントは呼び出されていないため、データベースは更新されません:(
ここで、私の質問は、テキストボックスでデータベースを更新するためにどのイベントを使用するかです。 TextChangedイベントを試しましたが、すべてのキャラクターについて検証し、アプリケーションを遅くします。私はこの種のアプリケーションに適切なイベントを選択することに混乱しています!
ノート :**ボタンは異なるusercontrolにあります!
編集1: ボタンをクリックするためにいくつかのコマンドが添付されています。これらのコマンドは、lostfocusの前に実行されます!! lostfocusの後に優先順位を設定するか、添付の動作やコマンドのようなものを実行することはできますか?
編集2: 私はいくつかのコマンドを無効にしてアプリケーションをデバッグしていましたが、私が見つけたのは場合によっては、DelegateCommandがLostFocusの前に実行されるので、それを避けたいです。どうすればそれを行うことができますか?開発中に純粋なMVVMアプリケーションを開発することは不可能だと感じたので、CodeBehindを少し使用しています!
解決
コントロール内にキーボードフォーカスをトラップすることは、通常、UIデザインが不良の兆候です。UIの他の場所に入力する前にユーザーにデータを制御することを強制するのはかなりユーザーホスティイルです。
とはいえ、ここでイベントをまったく使用すべきではありません。 WPFでWindowsフォームアプリケーションを作成しようとしています。 WPFアプリケーションを作成する必要があります。
あなたの見解の論理モデルであるクラスを作成します - つまり、 string
テキストボックスのプロパティとa Command
プロパティ(または、おそらく、a RelayCommand
)保存ボタン用。テキストボックスを文字列プロパティにバインドします。
<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
なぜなら UpdateSourceTrigger
は PropertyChanged
, 、ソースオブジェクトは、ユーザーが文字を入力するたびに更新されます。
ボタンをコマンドプロパティにバインドします。
<Button CommandBinding="{Binding SaveCommand}">Save</Button>
適切なものを実装します CanSave
と Save
その方法 RelayCommand
(で説明されているように ジョシュ・スミス MVVMパターンに関する重要な記事が必要であるため、文字列プロパティが有効でない場合はボタンが有効になっている場合があります。
他のヒント
最善のアプローチは、すべての有効な情報が収集されるまで、ユーザーが進むことを妨げることだと思います。
インストールウィザードのように Terms & Conditions Dialog
と Next
ボタン。あなたがチェックするまで I Agree
チェックボックス、 Next
ボタンは無効です。
これにより、有効な情報を提供せずにユーザーの手続きを心配する必要はありません。これにより、任意のイベントを使用できます TextBox
データを検証します。