Training for D-Day

ブログの内容は個人の見解であり、所属する企業を代表するものではありません。

WPF/MVVM/C#/Prism5.0 エラー通知の少し便利な仕組み② -ValidationAttribute-

qiita.com

※Qiitaにも投稿しています。

ValidationAttribute

Prismとは直接関係がないのですが、PrismのErrorsContainerを利用すると少しだけ簡単にエラー通知の実装ができることをご紹介しました。

WPF/MVVM/C#/Prism5.0 エラー通知の少し便利な仕組み -ErrorsContainer-

その中で、ViewModelのプロパティの属性に付けられるValidationAttributeに様々な種類があることがわかりました。 MSDNでは以下のURLになります。

https://msdn.microsoft.com/ja-jp/library/system.componentmodel.dataannotations(v=vs.110).aspx

ValidationAttributeの種類と用途

簡単ですが、少し整理してみました。

用途分類1 用途分類2 クラス名 属性の指定の仕方(エラーメッセージ部分は適当です) 備考
数値 範囲指定 Range [Range(0, 1000, ErrorMessage = Value for {0} must be between {1} and {2}.")]"
文字数 最小のみ MinLength [MinLength(5, ErrorMessage = Value for {0} must be bigger {1}.")]"
最大のみ MaxLength [MaxLength(5, ErrorMessage = Value for {0} must be smaller {1}.")]"
範囲指定 StringLength [StringLength(10, MinimumLength = 5, ErrorMessage = Value for {0} must be between {1} and {2}.")]" コンストラクタにMaxを入れる。(わかりづらい・・・)
必須 Required [Required(ErrorMessage = {0} is required.")]"
文字形式 電話 Phone [Phone(ErrorMessage = Invalid Phone format.")]" フォーマット設定はできなそう。
Email EmailAddress [EmailAddress(ErrorMessage = Invalid Email Address")]" フォーマット設定はできなそう。
Url Url [Url(ErrorMessage = Invalid Url")]" フォーマット設定はできなそう。
ファイル拡張子 FileExtensions [FileExtensions( Extensions=".jpg,.xml,.xlsx", ErrorMessage = "Please specify a valid image file ({1})"]" Extensionsにカンマ区切りで文字列指定。
正規表現 なんでもあり RegularExpression [RegularExpression(@ここに正規表現記載", ErrorMessage = "Value for {0} must be XYZ.")]"
マルチバイトのみ RegularExpression [RegularExpression(@[^\x01-\x7E]+", ErrorMessage = "Value for {0} must be multi-byte-char or half-width kana.")]"
日時 日付のみ Range [Range(typeof(DateTime), "2011/1/1","2016/1/1", ErrorMessage = "Value for {0} must be between {1} and {2}.")]" Rangeにて、取りうる日付の範囲を決めてやれば流用できる。
日付+時間 Range [Range(typeof(DateTime), "2011/1/1 12:00:00","2016/1/1 03:00:00", ErrorMessage = "Value for {0} must be between {1} and {2}.")]" Rangeにて、取りうる日時の範囲を決めてやれば流用できる。

数値かどうかはRangeを利用したほうが良さそうですね。 他にも様々ありましたが、基本はRegularExpressionとRangeの応用でほとんどのチェックは出来そうです。

サンプルコードをGitHubに挙げてあります。

github.com