방법: 바인딩 유효성 검사 구현
이 예제에서는 사용자 지정 유효성 검사 규칙을 기준으로 잘못된 값이 입력될 때 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>
<local: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 override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int age = 0;
try
{
if (((string)value).Length > 0)
age = int.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>
다음 예제와 같이 오류 메시지를 보여 주는 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>
데이터 개체
다음 코드 조각은 이전 코드 예제에서 사용된 데이터 개체입니다. 인스턴스는 XAML에서 다음 키를 ods
사용하여 정적 리소스로 만들어집니다.
public class MyDataSource
{
public MyDataSource()
{
Age = 0;
Age2 = 0;
}
public int Age { get; set; }
public int Age2 { get; set; }
public int Age3 { get; set; }
}
Public Class MyDataSource
Public Sub New()
Me.Age = 0
Me.Age2 = 0
End Sub
Public Property Age As Integer
Public Property Age2 As Integer
Public Property Age3 As Integer
End Class
전체 예제
전체 예제는 바인딩 유효성 검사 샘플을 참조하세요.
사용자 지정 ErrorTemplate을 제공하지 않으면 유효성 검사 오류가 있을 때 사용자에게 시각적 피드백을 제공하기 위해 기본 오류 템플릿이 나타납니다. 자세한 내용은 데이터 바인딩 개요의 “데이터 유효성 검사”를 참조하세요. 또한 WPF는 바인딩 소스 속성을 업데이트하는 동안 throw된 예외를 catch하는 기본 제공 유효성 검사 규칙을 제공합니다. 자세한 내용은 ExceptionValidationRule를 참조하세요.
참조
.NET Desktop feedback