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

이 예제에서는 및 스타일 트리거를 사용 하 여 ErrorTemplate 사용자 지정 유효성 검사 규칙을 기반으로 잘못 된 값이 입력 될 때 사용자에 게 알리는 시각적 피드백을 제공 하는 방법을 보여 줍니다.

예제

다음 예제에서의 텍스트 콘텐츠는 TextBox Age 이라는 바인딩 소스 개체의 속성 (int 형식의 속성)에 바인딩됩니다 ods . 바인딩이 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 구문 분석 중에 예외가 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

다음 예제에서는 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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

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

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

참조