QA@IT

WPFのbindingのバリデーションが触れられていないテキストボックスでチェックされない

3033 PV

テキストボックスを数個配置したシンプルなフォームをWPFで作っています。
テキストボックスによっては8桁の数字にしないといけないとか指定したいのでValidationRulesを設定してバリデーションを行っています。

基本的には問題なく動いているのですが、唯一、テキストボックスを全く入力しなかったものは場合バリデーションチェックがされずにエラーなしとみなされます。
何らかの入力をしてターゲットからソースに値を反映すればそこでバリデーションが行われるのですが一度も入力しなかったらチェックされないようです。

チェック処理のときに、手動ですべてのbindingを取り出してひとつずつupdateSourceを行えばやりたいことができるのは確認しましたが、bindingの数が増えれば大変ですし管理する場所が増えるので、良い方法を教えていただきたいです。

すでに試した方法は

(1) ValdationRulesの設定でソースからターゲットでもバリデーションするようにする

だめなところ:最初のウィンドウが出たときにエラー扱いになるのですが、最初からエラー表示されていると困るのでチェック処理をするまでは触れていないフォームはエラー表示なしにしたいです

(2) それぞれのバリデーションなのでまとめる必要はないがとりあえずBindingGroupにしてバリデーション

だめなところ:BindingGroupを設定したコントロール(Gridなど)に対してもエラーと扱われる(赤い枠が出る)ので他のところに影響が出ない方法がいいです。

バリデーションする上でよくある問題なように思うので、一般的にはこうするというのがあれば教えてほしいです。


またINotifyDataErrorInfoを使って、ViewModelのプロパティのsetterでエラーチェックしてるところでも、同じように一度も触れていなければエラーにならない問題があります。

setterが実行されないのであたりまえではありますが、この場合はすべてのプロパティのsetterに記述しているエラーチェックをまとめて行う関数を作っておくのが普通でしょうか?


長くなりましたが、ValidationRulesのときとINotifyDataErrorInfoの2パターンでのバリデーションチェックがされない場合の対処方法です。よろしくお願いします。

回答

このあたりなのかな?
ttp://stackoverflow.com/questions/33256045/wpf-validation-depending-on-required-not-required-field

『wpf validation required field』でgoogle先生に聞いてみるともっといい答えがあるかも

編集 履歴 (0)
  • stackoverflowなどをぐぐってみると、(1)の方法が多そうでした。
    エラー扱いにはしておいて、ボタン押したらスタイルを変えるようにするのがいいのかもですね。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。