WPF/MVVM/C#/Prism5.0 エラー通知の少し便利な仕組み② -ValidationAttribute-
※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.")]" | フォーマット設定はできなそう。 |
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に挙げてあります。