방법: 바인딩 유효성 검사 구현

이 예제에서는 사용자 지정 유효성 검사 규칙을 기준으로 잘못된 값이 입력될 때 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>

다음 예제에서는 ValidationRule에서 상속하고 Validate 메서드를 재정의하는 AgeRangeRule의 구현을 보여 줍니다. Int32.Parse 메서드가 값에 호출 잘못된 문자가 포함되어 있지 않은지 확인합니다. Validate 메서드는 ValidationResult를 반환하며 이는 구문 분석 중 예외가 catch되었는지 여부 및 연령 값이 하한 및 상한을 벗어나는지 여부에 따라 값이 유효한지를 나타냅니다.

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

다음 예제에서는 사용자에게 유효성 검사 오류를 알려주는 빨간색 느낌표를 만드는 사용자 지정 ControlTemplatevalidationTemplate을 보여 줍니다. 컨트롤 템플릿을 사용하여 컨트롤의 모양을 다시 정의합니다.

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

다음 예제와 같이 오류 메시지를 보여 주는 ToolTiptextBoxInError라는 스타일을 사용하여 만들어집니다. 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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

전체 예제는 바인딩 유효성 검사 샘플을 참조하세요.

사용자 지정 ErrorTemplate을 제공하지 않으면 유효성 검사 오류가 있을 때 사용자에게 시각적 피드백을 제공하기 위해 기본 오류 템플릿이 나타납니다. 자세한 내용은 데이터 바인딩 개요의 “데이터 유효성 검사”를 참조하세요. 또한 WPF는 바인딩 소스 속성을 업데이트하는 동안 throw된 예외를 catch하는 기본 제공 유효성 검사 규칙을 제공합니다. 자세한 내용은 ExceptionValidationRule를 참조하세요.

참조