2011-06-26 11 views
3

MVVMパターンに続くこの特定のWPFアプリケーションでは、ビューモデルはIDataErrorInfoインターフェイスを実装して、テキストフィールドの無効なデータを表示します。検証エラーがユーザーに表示される前に遅延を作成する

ボリュームを入力できるテキストボックスがビューにあります。これは、プロパティで指定されたアップデート元を変更し、データエラーを検証:

<TextBox 
    Text="{Binding Volume, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> 

これに伴う問題は、ユーザーが入力を完了する前に、検証エラーを取得していることです。たとえば、有効な値は「25 ml」です。しかし、ユーザーが最後の "l"をタイプする前に、 "25 m"がテキストボックスに表示されます。これは有効な値ではないため、IDataErrorの実装ではこのようになります。

結果として、入力中に赤いマーカーがテキストボックスの周りで点滅します。

テキストボックスの周囲に赤色のマーカーが表示されるまでに少し時間がかかります(0.5秒)ので、検証エラーを表示する前にユーザーが入力を完了したと仮定できます。

最初に、ビューモデルでプロパティを更新する前に0.5秒待つ特殊なテキストボックスを作成しました。ユーザーが有効な値を入力した場合は、送信ボタンが有効になる前に0.5秒が経過しているため、これは問題ありません。

私は、この動作を実装する特殊なバインディング(つまり、System.Windows.Data.Bindingから派生した特殊なクラスを作成する)を書くことができると考えていますが、これを行う方法はわかりません。

それはもっともらしい方法ですか、それとも良いですか?

+0

をなぜあなたはUpdateSourceTrigger = PropertyChanged' '必要なのでしょうか? –

+2

そうでない場合、フィールドがフォーカスを失うまでビューモデルのプロパティは更新されません。また、送信ボタンコマンドには、すべてのフィールドが入力されたことを確認するCanExecute()実装があるため、フィールドがフォーカスを失うまでボタンをクリックすることはできません。 – Pete

答えて

2

Paul Stovellがブログで投稿したカスタムDelayBindingを使用できるように思えます。遅延検索/フィルタリングを成功させて使用しました。あなたはここでそれについて読むことができます。

http://www.paulstovell.com/wpf-delaybinding

+1

明確にするために、DelayBindingはターゲットを更新するのを遅らせるので、ユーザがテキストボックスに有効な値を入力するまで検証を遅らせることができます - 遅延時間を任意の値に設定することができます – sellmeadog

+1

問題は、有効な入力の場合に送信ボタンが有効になるまで – Pete

+1

しかし、ユーザーはEnterキー(または指定した他のキー)を押して強制的に値を確定し、送信ボタンを有効にすることができます。さもなければ、私はそれはトレードオフだと思う:有効な値が入力されるまでユーザーがキーストロークごとにエラーを受け取るか、有効な値を入力した後に送信ボタンが有効になるまで0.5秒待つか?いずれにしても、遅延を伴うカスタムバインディングを作成する良い例です。 – sellmeadog

関連する問題