方法: バインディングの検証の実装How to: Implement Binding Validation

この例は、使用する方法を示します、ErrorTemplateし、無効な値を入力したら、ユーザーに通知する視覚的なフィードバックを提供するスタイルのトリガーのカスタム検証規則に基づいています。This example shows how to use an ErrorTemplate and a style trigger to provide visual feedback to inform the user when an invalid value is entered, based on a custom validation rule.

Example

テキストの内容、TextBoxに次の例では、バインド、 Age (int 型) のプロパティをという名前のバインディング ソース オブジェクトのodsします。The text content of the TextBox in the following example is bound to the Age property (of type int) of a binding source object named ods. バインディングは、AgeRangeRule という名前の検証規則を使用するよう設定されているため、ユーザーが数字以外の文字、または 21 から 130 の範囲外の値を入力すると、テキスト ボックスの横に赤の感嘆符が表示され、ユーザーがテキスト ボックス上にマウスを置くとエラー メッセージを含んだツール ヒントが示されます。The binding is set up to use a validation rule named AgeRangeRule so that if the user enters non-numeric characters or a value that is smaller than 21 or greater than 130, a red exclamation mark appears next to the text box and a tool tip with the error message appears when the user moves the mouse over the text box.

<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メソッド。The following example shows the implementation of AgeRangeRule, which inherits from ValidationRule and overrides the Validate method. Int32.Parse() メソッドは、値に無効な文字が含まれていないことを確認するために、値に対して呼び出されます。The Int32.Parse() method is called on the value to make sure that it does not contain any invalid characters. Validateメソッドを返します。 をValidationResult値が有効である、解析中に例外をキャッチするかどうかと、保存期間の値が下限と上限の外部でがかどうかに基づいていることを示します。The Validate method returns a ValidationResult that indicates if the value is valid based on whether an exception is caught during the parsing and whether the age value is outside of the lower and upper bounds.

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 ValidationResult.ValidResult;
        }
    }
}

次の例は、カスタムControlTemplatevalidationTemplate検証エラーをユーザーに通知する赤い感嘆符を作成します。The following example shows the custom ControlTemplate validationTemplate that creates a red exclamation mark to notify the user of a validation error. コントロール テンプレートは、コントロールの外観を再定義するために使用されます。Control templates are used to redefine the appearance of a control.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

次の例で示すように、ToolTipという名前のスタイルを使用して、エラー メッセージが作成されたことを示すtextBoxInErrorします。As shown in the following example, the ToolTip that shows the error message is created using the style named textBoxInError. 場合の値HasErrortrue、トリガー設定の現在のツール ヒントTextBoxをその最初の検証エラー。If the value of HasError is true, the trigger sets the tool tip of the current TextBox to its first validation error. RelativeSourceに設定されているSelf、現在の要素を参照します。The RelativeSource is set to Self, referring to the current element.

<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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

コード例全体については、「バインディングの検証のサンプル」をご覧ください。For the complete example, see Binding Validation Sample.

カスタムを指定しない場合ErrorTemplate検証エラーがある場合に、ユーザーに視覚的なフィードバックを提供する既定のエラー テンプレートが表示されます。Note that if you do not provide a custom ErrorTemplate the default error template appears to provide visual feedback to the user when there is a validation error. 詳しくは、「データ バインドの概要」の「データの検証」をご覧ください。See "Data Validation" in Data Binding Overview for more information. さらに WPFWPF は、バインディング ソース プロパティの更新中にスローされる例外をキャッチするための、組み込みの検証規則を提供します。Also, WPFWPF provides a built-in validation rule that catches exceptions that are thrown during the update of the binding source property. 詳細については、「 ExceptionValidationRule 」を参照してください。For more information, see ExceptionValidationRule.

関連項目See also