3

たくさんのTextBoxと、Save、SaveAsなどのいくつかのボタンがあるアプリケーションがあります。

ユーザーがTextBoxを編集するとき、データベースで範囲を確認し、範囲を検証して、データベースを更新する必要があります。ユーザーが入力した値にエラーがある場合は、TextBoxがフォーカスを失うことを許可しないでください。

私はこれにLostFocusイベントを使用していましたが、最近アプリケーションのバグを発見するまでは正常に機能していました。

バグ:ユーザーがTextBoxの値を編集してから、[保存]ボタンをクリックします。LostFocusイベントが呼び出されないため、データベースが更新されません:(

ここで私の質問は、データベースを更新するためにTextBoxでどのイベントを使用する必要があるかです。TextChangedイベントを試しましたが、すべての文字に対して検証され、アプリケーションが遅くなります。この種のアプリケーションに適したイベントを選択するのに混乱しています。

:**ボタンは別のUserControlにあります!

編集1:ボタンのクリックにいくつかのコマンドがアタッチされています。これらのコマンドはLostFocusの前に実行されます!! 優先順位を設定したり、添付の動作やコマンドのようなものをLostFocusの後に実行することはできますか?

編集2:いくつかのコマンドを無効にしてアプリケーションをデバッグしていましたが、場合によっては、DelegateCommandがLostFocusの前に実行されるため、それを避けたいと思います。どうすればそれについて行くことができますか?開発中に、純粋なMVVMアプリケーションを開発することは不可能だと感じたので、少しコードビハインドを使用しています。

4

2 に答える 2

1

コントロール内にキーボード フォーカスをトラップすることは、通常、UI 設計が悪いことを示しています。ユーザーが UI の他の場所に入力する前に、コントロール内のデータを修正するよう強制するのは、ユーザーにとって非常に敵対的です。

つまり、ここではイベントをまったく使用しないでください。WPF で Windows フォーム アプリケーションを作成しようとしています。WPF アプリケーションを作成する必要があります。

ビューの論理モデルであるクラスを作成します。つまり、stringテキスト ボックスのプロパティと[保存] ボタンのCommandプロパティ (または、より可能性が高い) があります。RelayCommandテキスト ボックスを文字列プロパティにバインドします。例:

<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

UpdateSourceTriggerはであるためPropertyChanged、ユーザーが文字を入力するたびにソース オブジェクトが更新されます。

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

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

文字列プロパティが有効な場合はボタンが有効になり、有効でない場合はボタンが無効になるように、(MVVM パターンに関するJosh Smith の重要な記事で説明されているように) に必要な適切なCanSaveおよびSaveメソッドを実装します。RelayCommand

于 2010-12-16T00:34:58.617 に答える
1

すべての有効な情報が収集されるまで、ユーザーが先に進めないようにするのが最善の方法だと思います。

Terms & Conditions DialogNextボタンのあるインストール ウィザードのように。チェックボックスをオンにするまでI AgreeNextボタンは無効になります。

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

于 2010-12-15T07:34:51.093 に答える