あいてぃーとふぼふ

WP7のバリデーション(基礎編)

バリデーションとは入力値の検証処理のことです。ところで、WP7におけるバリデーションってどうするのが正しいのでしょうか╹ω╹)?

標準の画面ではどうなってるの?

ちょっと調べた限りだと、WP7のBindingクラスにもValidatesOnExceptionsやNotifyOnValidationErrorプロパティは存在しています。しかし、DataAnnotationsの検証属性やIDataErrorInfo、INotifyDataErrorInfoといったクラスは存在していません。この時点で、従来のSilverlightのように赤いToolTipが表示されるようなことは期待できそうにありませんね…(´・ω・`)

なので、WP7のMS謹製な画面でバリデーションが必要そうな項目を探してみたところ、メールアドレスを入力するテキストボックスにおいて、必須項目やアドレスの形式を判定してました!で、結論から申しますと上記の画面では、入力値が正しくない場合に画面内の入力内容を確定するボタンが押せなくなる仕様となっていました。このため、ユーザさんが不意にアドレスの形式を誤ってしまったとしても、なぜボタンが押せないのかを即座に理解することができません。このシンプルさがメトロなのだといわれると…もうなにも言い返せませんよね~! (>ω<、)

実装するとこんな感じ!

ということで、WP7アプリでバリデーションを実施する場合、MVVMライクに行くならICommnadのCanExecuteメソッドで実施するのがよさそうですね。さっそく簡単なサンプルプログラムを作成してみました。このサンプルでは、テキストボックスに値が入力されていない場合にOKボタンが非活性状態となり、ついでにOKボタンを押下したときにメッセージボックスを表示する仕様とします。上段がView、下段がViewModelの実装例です。

ICommnadのCanExecuteメソッドを利用すると、コントロールのIsEnabledプロパティなどを明示的に設定していなくても、CanExecuteメソッドの戻り値に応じてコントロールの活性状態を自動的に変更してくれますので便利です。ほかにも、MvvmLightのButtonBaseExtensionsクラスやPrismのIInteractionRequestを利用することにより、上記の仕様を簡潔に実装してみました。

サンプルプログラム!

詳細な内容は以下のサンプルプログラムをご覧ください。
ValidationSample

ちょっとまって!

でも、実はこのサンプルプログラムにはちょっとした問題があります。実行してもらえればわかると思いますが、テキストボックスからロストフォーカスしたタイミングで検証が実行されるのです。つまり、テキストを変更してもそのタイミングでは検証処理が実行されない(ボタンの活性状態が変化しない)ため、テキストを空にしてもなんかOKボタンが押せそうな気になります(実際は押せませんが)。できれば1文字入力するごとにOKボタンの活性状態を変化させたいですよね。ということで、これを解決する方法は次回の投稿でご紹介します!…でもやっぱり一筋縄じゃいきません(汗