方法 : バインディングの検証の実装

更新 : 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」を参照してください。

参照

処理手順

データ バインディングのデモ

概念

データ バインディングの概要

その他の技術情報

データ バインディングのサンプル

データ バインディングに関する「方法」トピック