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のようにテキストボックスが赤い枠に囲まれ、エラーメッセージが表示されます。

