Silverlight 3 Beta 1の入力データ検証

以前、WPFSilverlightの入力データ検証(BindingのValidation)について計8回の投稿を行いました。

入力データ検証 その1
入力データ検証 その2 ErrorTemplate
入力データ検証 その3 HasError添付プロパティ
入力データ検証 その4 Error添付イベント
入力データ検証 その5 DataErrorValidationRule
入力データ検証 その6 カスタムValidationRule
入力データ検証 その7 BindingGroup
入力データ検証 その8 Silverlight 2



今回は、この入力データ検証においてSilverlight 3 Beta 1で新たに追加された内容をご紹介したいと思います。


WPFにあった機能がそのまま実装されたもの
Silverlight 2にはValidationクラスがありませんでしたが、Silverlight 3 Beta 1で追加されました。

http://msdn.microsoft.com/en-us/library/system.windows.controls.validation_members(VS.96).aspx



提供されているメンバはErrors添付プロパティとHasError添付プロパティです。HasError添付プロパティを利用して、WPFと同じように「入力データ検証 その3 HasError添付プロパティ」で紹介したような実装を行うことができますSilverlightにはトリガがありませんので、紹介したような実装をそのまま行うことはできません)。


当然ながらValidationErrorクラスも追加されており、こちらで提供されているメンバはExceptionプロパティのみです。まぁ、相変わらずBindingにValidationRulesプロパティは用意されておらずExceptionによる検証エラーしか使えませんので、ErrorContentプロパティが不要なのは当たり前ですね。


Silverlightには添付イベントの概念がないため、Error添付イベントは提供されていません。Silverlight 2と同様にFrameworkElement.BindingValidationErrorイベントを使用します。


ErrorTemplate添付プロパティも提供されていないのですが、その代わりとなる新しい機能がSilverlight 3 Beta 1では追加されています。それは次の項で紹介します。


WPFとは違う形で実装された機能
Silverlight 3 Beta 1にErrorTemplate添付プロパティは実装されていませんが、その代わりにTextBoxなどのコントロールのControlTemplateにはValidationStatesという新しいVisualStateGroupが追加されました。このVisualStateGroupにはValid、InvalidUnfocused、InvalidFocusedという3つのVisualStateが存在し、Bindingの検証エラーの状態に合わせて各VisualStateが適用されるようになっています。


デフォルトのControlTemplateでは、下記の画像のようにコントロールに赤い枠線が表示され、クリック時、もしくは右上のコーナー部分のマウスオーバーしたときに検証エラーの内容(ValidationErrorから取得したException.Message)が書かれた赤いToolTipが表示されるようになっています。



デフォルトのControlTemplateをBlendで確認すると、下記のようになります。



Silverlight 2と比較した場合、ValidationErrorElementが1つ増えただけではないかと思います。ちなみにToolTip部分のControlTemplateは、ほかのコントロールとも共通なためかTextBoxのControlTemplateに内包されてはおらず外に宣言されます。


ステートはこんな感じです。



ValidationErrorElementとValidationToolTipTemplateを変更することで、下記のようにカスタマイズも自由に行えます。



ちなみにValidationStatesが組み込まれているコントロールは、

  • TextBox
  • CheckBox
  • RadioButton
  • ComboBox
  • ListBox
  • PasswordBox(Beta 1では未実装?)

となっているようです。


WPFのErrorTemplate添付プロパティを使った方式に比べこちらの方式のほうがすぐれているのは、VisualTransitionを使用できる点ではないかと思います。ErrorTemplate添付プロパティの場合、検証エラー時に表示する外観はControlTemplateで自由にカスタマイズできますが、そのTemplateをどのように表示させるかというのは設定できません。ValidationStatesを使う方式であれば、VisualTransitionを使ってゆっくりフェードインしてくるような表示のさせ方も可能になります。また、Blendのデザイナを使って編集できるという点ももちろん有利な点ですね。


WPFでもバージョン4からVisualStateManagerが導入されるそうですので、このValidationStatesも実装されるのではないかと思います。その場合、デフォルトのErrorTemplateは空になりそうですね。