WPFのTextBox(LostFocus、LostKeyBoardFocusなど)からモデルを更新するために使用するイベントはどれですか? WPFでイベントの優先順位を設定する方法は?

StackOverflow https://stackoverflow.com/questions/4447645

質問

私は、多くのテキストボックスと、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}"/>

なぜなら UpdateSourceTriggerPropertyChanged, 、ソースオブジェクトは、ユーザーが文字を入力するたびに更新されます。

ボタンをコマンドプロパティにバインドします。

<Button CommandBinding="{Binding SaveCommand}">Save</Button>

適切なものを実装します CanSaveSave その方法 RelayCommand (で説明されているように ジョシュ・スミス MVVMパターンに関する重要な記事が必要であるため、文字列プロパティが有効でない場合はボタンが有効になっている場合があります。

他のヒント

最善のアプローチは、すべての有効な情報が収集されるまで、ユーザーが進むことを妨げることだと思います。

インストールウィザードのように Terms & Conditions DialogNext ボタン。あなたがチェックするまで I Agree チェックボックス、 Next ボタンは無効です。

これにより、有効な情報を提供せずにユーザーの手続きを心配する必要はありません。これにより、任意のイベントを使用できます TextBox データを検証します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top