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

이 예제에서는 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 메서드가 구문 분석 중 예외가 catch되었는지 여부 및 연령 값이 하한 및 상한을 벗어나는지 여부에 따라 값이 유효한지를 나타내는 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>

전체 예제를 보려면 Binding Validation 샘플을 참조하십시오.

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

참고 항목

개념

데이터 바인딩 개요

기타 리소스

데이터 바인딩 방법 항목