方法 : バインディングの検証の実装
更新 : 2007 年 11 月
この例では、ErrorTemplate およびスタイル トリガを使用して、カスタム検証規則に基づき無効な値が入力されたことをユーザーに通知するための視覚的フィードバックを提供する方法を示します。
使用例
次の例で使用されている TextBox のテキスト コンテンツは、ods という名前のバインディング ソース オブジェクトの Age プロパティ (int 型) にバインドされています。 バインドは、AgeRangeRule という名前の入力規則を使用するよう設定されています。つまり、ユーザーが数字以外の文字、または 21 ~ 130 の範囲外の数値を入力すると、テキスト ボックスの横に赤の感嘆符が表示され、ユーザーがテキスト ボックス上にマウスを置くとエラー メッセージを含んだツール ヒントが示されます。
<TextBox Name="textBox1" Width="50" FontSize="15"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textBoxInError}"
Grid.Row="1" Grid.Column="1" Margin="2">
<TextBox.Text>
<Binding Path="Age" Source="{StaticResource ods}"
UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<c:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
次の例では AgeRangeRule の実装方法を示します。この規則は、ValidationRule から継承され、Validate メソッドをオーバーライドします。Int32.Parse() メソッドは、値に無効な文字が含まれていないことを確認するために、値に対して呼び出されます。Validate メソッドは、解析中に例外が発生したかどうか、および年齢値が範囲外にあるかどうかに基づいて、値が有効かどうかを示す ValidationResult を返します。
public class AgeRangeRule : ValidationRule
{
private int _min;
private int _max;
public AgeRangeRule()
{
}
public int Min
{
get { return _min; }
set { _min = value; }
}
public int Max
{
get { return _max; }
set { _max = value; }
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int age = 0;
try
{
if (((string)value).Length > 0)
age = Int32.Parse((String)value);
}
catch (Exception e)
{
return new ValidationResult(false, "Illegal characters or " + e.Message);
}
if ((age < Min) || (age > Max))
{
return new ValidationResult(false,
"Please enter an age in the range: " + Min + " - " + Max + ".");
}
else
{
return new ValidationResult(true, null);
}
}
}
次の例では、検証エラーをユーザーに通知する赤い感嘆符を作成するための、カスタム ControlTemplate validationTemplate を示します。コントロール テンプレートは、コントロールの外観を再定義するために使用されます。
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
次の例に示すように、エラー メッセージを表示する ToolTip は、textBoxInError という名前のスタイル トリガを使って作成されます。HasError の値が true である場合、トリガは現在の TextBox のツール ヒントに、最初の検証エラーを設定します。RelativeSource には、現在の要素を参照している Self が設定されます。
<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
コード例全体については、「バインディングの検証のサンプル」を参照してください。
カスタム ErrorTemplate を提供しない場合、検証エラーがあった際にユーザーに視覚的にフィードバックするために、既定のエラー テンプレートが使用されることに注意してください。詳細については、「データ バインディングの概要」の「データの検証」を参照してください。さらに WPF は、バインド ソース プロパティの更新中にスローされる例外をキャッチするための、組み込みの検証規則を提供します。詳細については、「ExceptionValidationRule」を参照してください。