BindValidation
이 예제는 ErrorTemplate 및 사용자 지정 유효성 검사 규칙을 기반으로 잘못 된 값을 입력하는 경우 사용자에게 시각적 피드백을 제공하는 스타일 트리거를 사용하는 방법을 제공 합니다.
바인딩 소스 개체 정의
1: public class MyDataSource
2: {
3: public int Age { get; set; }
4: public int Age2 { get; set; }
5: public int Age3 { get; set; }
6: public MyDataSource()
7: {
8: Age = 0;
9: Age2 = 0;
10: }
11: }
유효성 검사 규칙 설정
바인딩 소스 개체의 Age속성을 TextBox.Text 속성에 바인딩 합니다. AgeRangeRule 이라는 유효성 검사 규칙을 사용하도록 설정되어 있으므로 숫자가 아닌 문자열 또는 21보다 작거나 130보다 큰 값을 입력하면 빨간색 느낌표가 텍스트 상자 옆에 나타나고 텍스트 상자 위로 마우스를 이동하면 오류 메시지가 포함된 도구 설명이 나타납니다.
1: <TextBlock Grid.Row="0" Grid.ColumnSpan="2" FontSize="20" Margin="8" Text="Enter a number between 21-130 or there will be a validation error:" />
2: <Label Grid.Column="0" Grid.Row="1" FontSize="15" Margin="2" Target="{Binding ElementName=textBox1}">TextBox with _custom ErrorTemplate and ToolTip:</Label>
3: <TextBox Name="textBox1" Width="50" FontSize="15"
4: Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
5: Style="{StaticResource TextBoxInError}"
6: Grid.Row="1" Grid.Column="1" Margin="2">
7: <TextBox.Text>
8: <Binding Path="Age" Source="{StaticResource Ods}"
9: UpdateSourceTrigger="PropertyChanged">
10: <Binding.ValidationRules>
11: <local:AgeRangeRule Min="21" Max="130" />
12: </Binding.ValidationRules>
13: </Binding>
14: </TextBox.Text>
15: </TextBox>
유효성 검사 규칙 구현
AgeRangeRule에서 상속 하는 ValidationRule.Validate 메서드를 재정의 합니다. Int32.parse() 메서드가 값에 호출되어 값에 잘못된 문자가 포함되어 있지 않은지 확인하고, Validate 메서드가 반환 되는 ValidationResult 구문 분석 중에 예외가 발견 되는 여부 및 value 값이 최소값과 최대값에 속함에 따라 값이 유효한 경우의 값을 반환 합니다.
1: public class AgeRangeRule : ValidationRule
2: {
3: public int Min { get; set; }
4: public int Max { get; set; }
5: public override ValidationResult Validate(object value, CultureInfo cultureInfo)
6: {
7: var age = 0;
8: // object 형을 int32형으로 변환하고 예외 발생 시 bool형의 유효성 검사 결과와 유저에게 반환하는 문자열을 생성자로 받는 ValidationResult를 반환 합니다.
9: try
10: {
11: if (((string)value).Length > 0)
12: age = int.Parse(value.ToString());
13: }
14: catch (Exception e)
15: {
16: return new ValidationResult(false, "Illegal characters or " + e.Message);
17: }
18: // 나이 최소값과 최대값을 벗어나는 나이가 입력 되었을 때 bool형의 유효성 검사 결과와 유저에게 반환하는 문자열을 생성자로 받는 ValidationResult를 반환 합니다.
19: if ((age < Min) || (age > Max))
20: {
21: return new ValidationResult(false, "Please enter an age in the range: " + Min + " - " + Max + ".");
22: }
23: // 유효성 검사 통과
24: return new ValidationResult(true, null);
25: }
26: }
사용자 정의 유효성 컨트롤 모양 지정
유효성 검사 오류 시 빨간색 느낌표가 사용자에 게 알릴 모양을 지정 합니다.
1: <ControlTemplate x:Key="ValidationTemplate">
2: <DockPanel>
3: <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
4: <AdornedElementPlaceholder />
5: </DockPanel>
6: </ControlTemplate>
스타일 속성 트리거
스타일을 사용 하여 오류 메시지를 ToolTip 속성에 작성 하는 것이 보여줍니다. 경우의 값 HasError이 true 일 때 발생 하며, 스타일을 설정 하는 TextBox의 첫 번째 유효성 검사 오류입니다. RelativeSource로 설정 된 Self는 스타일이 설정된 현재 요소를 참조 합니다.
1: <!-- Style Property Trigger 등록 -->
2: <Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
3: <Style.Triggers>
4: <!-- Validation.HasError 속성 값이 True일 경우 -->
5: <Trigger Property="Validation.HasError" Value="True">
6: <Setter Property="ToolTip"
7: Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
8: </Trigger>
9: </Style.Triggers>
10: </Style>
전체 소스
1: <Window x:Class="BindValidation.MainWindow"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6: xmlns:local="clr-namespace:BindValidation"
7: mc:Ignorable="d"
8: Title="MainWindow"
9: SizeToContent="WidthAndHeight">
10: <Window.Resources>
11: <local:MyDataSource x:Key="Ods" />
12: <ControlTemplate x:Key="ValidationTemplate">
13: <DockPanel>
14: <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
15: <AdornedElementPlaceholder />
16: </DockPanel>
17: </ControlTemplate>
18: <!-- Style Property Trigger 등록 -->
19: <Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
20: <Style.Triggers>
21: <!-- Validation.HasError 속성 값이 True일 경우 -->
22: <Trigger Property="Validation.HasError" Value="True">
23: <Setter Property="ToolTip"
24: Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
25: </Trigger>
26: </Style.Triggers>
27: </Style>
28: </Window.Resources>
29: <Grid>
30: <Grid.ColumnDefinitions>
31: <ColumnDefinition />
32: <ColumnDefinition />
33: <ColumnDefinition />
34: </Grid.ColumnDefinitions>
35: <Grid.RowDefinitions>
36: <RowDefinition />
37: <RowDefinition />
38: <RowDefinition />
39: <RowDefinition />
40: <RowDefinition />
41: </Grid.RowDefinitions>
42: <TextBlock Grid.Row="0" Grid.ColumnSpan="2" FontSize="20" Margin="8" Text="Enter a number between 21-130 or there will be a validation error:" />
43: <Label Grid.Column="0" Grid.Row="1" FontSize="15" Margin="2" Target="{Binding ElementName=textBox1}">TextBox with _custom ErrorTemplate and ToolTip:</Label>
44: <TextBox Name="textBox1" Width="50" FontSize="15"
45: Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
46: Style="{StaticResource TextBoxInError}"
47: Grid.Row="1" Grid.Column="1" Margin="2">
48: <TextBox.Text>
49: <Binding Path="Age" Source="{StaticResource Ods}"
50: UpdateSourceTrigger="PropertyChanged">
51: <Binding.ValidationRules>
52: <local:AgeRangeRule Min="21" Max="130" />
53: </Binding.ValidationRules>
54: </Binding>
55: </TextBox.Text>
56: </TextBox>
57: <Label Grid.Row="2" Grid.Column="0" FontSize="15" Margin="2" Target="{Binding ElementName=textBox2}">TextBox with _default ErrorTemplate:</Label>
58: <TextBox Name="textBox2" Width="50" FontSize="15" Grid.Row="2" Grid.Column="1" Margin="2">
59: <TextBox.Text>
60: <Binding Path="Age2" Source="{StaticResource Ods}"
61: UpdateSourceTrigger="PropertyChanged">
62: <Binding.ValidationRules>
63: <local:AgeRangeRule Min="21" Max="130" />
64: </Binding.ValidationRules>
65: </Binding>
66: </TextBox.Text>
67: </TextBox>
68: <TextBlock Grid.Row="3" Grid.ColumnSpan="3" FontSize="20" Margin="8" Text="The following TextBox uses the ExceptionValidationRule and UpdateSourceExceptionFilter handler:" />
69: <Label Grid.Row="4" Grid.Column="0" FontSize="15" Margin="2" Target="{Binding ElementName=textBox3}">TextBox with UpdateSourceExceptionFilter _handler:</Label>
70: <TextBox Name="textBox3" Width="50" FontSize="15" Grid.Row="4" Grid.Column="1" Margin="2"
71: Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
72: Style="{StaticResource TextBoxInError}">
73: <TextBox.Text>
74: <Binding Path="Age3" Source="{StaticResource Ods}"
75: UpdateSourceTrigger="PropertyChanged">
76: <Binding.ValidationRules>
77: <ExceptionValidationRule />
78: </Binding.ValidationRules>
79: </Binding>
80: </TextBox.Text>
81: </TextBox>
82: <CheckBox Name="cb" FontSize="15" HorizontalAlignment="Left" Grid.Row="4" Grid.Column="2" Margin="5" Checked="UserCustomHandler" Unchecked="DisableCustomHandler">Enable Custom Handler (see ToolTip)</CheckBox>
83: </Grid>
84: </Window>
댓글
댓글 쓰기