방법: 바인딩 유효성 검사 구현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 구문 분석 중에 예외가 catch 되는지 여부와 사용 기간 값이 하 한과 상한 범위 밖에 있는지 여부에 따라 값이 유효한 지 여부를 나타내는을 반환 합니다.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
{
    public int Min { get; set; }
    public int Max { get; set; }

    public AgeRangeRule()
    {
    }

    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}.");
        }
        return ValidationResult.ValidResult;
    }
}
Public Class AgeRangeRule
    Inherits ValidationRule

    ' Properties
    Public Property Max As Integer
    Public Property Min As Integer
        
    ' Methods
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        Dim num1 As Integer = 0
        Try 
            If (CStr(value).Length > 0) Then
                num1 = Integer.Parse(CStr(value))
            End If
        Catch exception1 As Exception
            Return New ValidationResult(False, $"Illegal characters or {exception1.Message}")
        End Try
        If ((num1 < Min) OrElse (num1 > Max)) Then
            Return New ValidationResult(False, $"Please enter an age in the range: {Min}-{Max}.")
        End If
        Return ValidationResult.ValidResult
    End Function

End Class

다음 예제에서는 ControlTemplate validationTemplate 사용자에 게 유효성 검사 오류를 알리는 빨간색 느낌표를 만드는 사용자 지정을 보여 줍니다.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. 의 값이 이면 HasError true 트리거는 현재의 도구 설명을 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 Bind 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은 바인딩 소스 속성을 업데이트하는 동안 throw된 예외를 catch하는 기본 제공 유효성 검사 규칙을 제공합니다.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