Silverlight 3の入力値検証
ユーザーから値の入力を受ける場合にどんなアプリケーションでも行うことに値の検証(チェック)があります。アプリケーションではユーザーが入力した汚れているかもしれないデータを、きれいなデータのみにして後方のデータ登録サービスに渡す必要があります。Silverlight 3ではどのように値の検証を行うか見ていきましょう。
ユーザーが入力した値の検証
Silverlightでユーザーが入力した値の検証を行う場合、もっとも一般的なのがプロパティーのセット時に例外を発生させてユーザーに通知する方法です。
リスト7のような入力画面があります。氏名と年齢はバインディング先のプロパティーで例外が発生した場合にエラー表示されるようにValidatesOnExceptions属性をTrueに設定しています。
<StackPanel x:Name="LayoutRoot"> <StackPanel Orientation="Horizontal"> <TextBlock Text="氏名" /> <TextBox Text="{Binding Path=UserName, Mode=TwoWay, ValidatesOnExceptions=True}" /> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="年齢" /> <TextBox Text="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}" /> </StackPanel> </StackPanel>
同様にリスト8のようなコードビハインドがあります。
public partial class MainPage : UserControl, INotifyPropertyChanged { public MainPage() { InitializeComponent(); this.DataContext = this; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string name) { if (PropertyChanged == null) return; PropertyChanged(this, new PropertyChangedEventArgs(name)); } private string _userName; /// <summary> /// 氏名 /// </summary> /// <remarks> /// 氏名は必ず入力され、40文字以内であること。 /// </remarks> public string UserName { get { return _userName; } set { if (string.IsNullOrEmpty(value)) throw new ValidationException("氏名は必須入力です。"); if (value.Length > 40) throw new ValidationException("氏名は40文字以内で入力してください。"); _userName = value; OnPropertyChanged("UserName"); } } private string _age; /// <summary> /// 年齢 /// </summary> /// <remarks> /// 年齢は必ず入力され、20以上の整数であること。 /// </remarks> public string Age { get { return _age; } set { if (string.IsNullOrEmpty(value)) throw new ValidationException("年齢は必須入力です。"); int age; if (! int.TryParse(value, out age)) throw new ValidationException("年齢は数字で入力してください。"); if (20 > age || age > 150) throw new ValidationException("年齢は20歳以上を入力してください。"); _age = value; OnPropertyChanged("Age"); } } #endregion }
コード側には、画面にバインドするUserNameプロパティーとAgeプロパティーの2つがあり、それぞれのSetterではユーザーが入力した値の検証を行い、検証に通らなかった場合はExceptionを発生させ画面に通知しています。画面側はValidatesOnExceptionsプロパティーがTrueに設定されているため、例外が起きた場合は図5のようにテキストボックスが赤い枠に囲まれ、エラーメッセージが表示されます。