WPF.Basic数据验证

Validation两种验证方法:(1) ValidationRule (2)iDataErrorInfo+DataAnimation 的用法

Validation:依赖属性用(在验证回调中返回false)

ValidationRule:依赖属性和普通类的属性都能用
IdataErrorInfo:依赖属性和普通类的属性都能用,谁想用的话 就继承iDataErrorInfo

区别?

ValidationRule可以自定义错误信息,Validation和ValidationRule在xaml中的用法一样,比较繁琐

iDataErrorErrorInfo可以使用属性索引器,在xaml中只需咋binding表达式中打开ValidatesOnDataErrors=True即可,xaml代码比较少

ValidationRule和iDataErrorInfo的错误信息都是被全局静态对象Validation接收的

  定义资源扩展标记

复制代码
   <Window.Resources>
        <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>

        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <AdornedElementPlaceholder/>
                <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
            </DockPanel>
        </ControlTemplate>
        <local:Mydata x:Key="SimPleBinding"/>
        <local:Customer x:Key="CustomerInstance"  Age="13" />
        
    </Window.Resources>
复制代码

 

1.ValidationRule 依赖属性的验证

1.1 Textbox的输入值是否满足与最大与最小值之间并且是限定的输入类型

     界面代码XAML:

复制代码
 1  <TextBox Name="textBox1" FontSize="15" Width="100" Height="20"
 2              Validation.ErrorTemplate="{StaticResource validationTemplate}"
 3              Style="{StaticResource textBoxInError}"
 4              Grid.Row="0" Grid.Column="1">
 5         <TextBox.Text>
 6             <Binding Source="{StaticResource SimPleBinding}"  Path="Age"  UpdateSourceTrigger="PropertyChanged">
 7                 <Binding.ValidationRules>
 8                     <local:AgeRangeRule Min="21" Max="130"/>
 9                 </Binding.ValidationRules>
10             </Binding>
11         </TextBox.Text>
12     </TextBox>
复制代码

   绑定的依赖属性代码C#

复制代码
 1  public class AgeRangeRule : ValidationRule
 2     {
 3         public int Min { get; set; }
 4         public int Max { get; set; }
 5 
 6         public AgeRangeRule()
 7         {
 8 
 9         }
10 
11         public override ValidationResult Validate(object value, CultureInfo cultureInfo)
12         {
13             int age = 0;
14 
15             try
16             {
17                 if (((string)value).Length > 0)
18                     age = Int32.Parse((String)value);
19             }
20             catch (Exception e)
21             {
22                 return new ValidationResult(false, $"Illegal characters or {e.Message}");
23             }
24 
25             if ((age < Min) || (age > Max))
26             {
27                 return new ValidationResult(false,
28                   $"Please enter an age in the range: {Min}-{Max}.");
29             }
30             return ValidationResult.ValidResult;
31         }
32     }
复制代码

2.IdataErrorInfo 依赖属性的验证

   2.1 XAML 界面代码

复制代码
 1   <TextBox Name="textBox2" FontSize="15" Width="100" Height="20"
 2            
 3              Grid.Row="1" Grid.Column="1">
 4             <TextBox.Style>
 5                 <Style TargetType="{x:Type TextBox}">
 6                     <Style.Triggers>
 7                         <Trigger Property="Validation.HasError" Value="True">
 8                             <Setter Property="Background" Value="Orange" />
 9                             <Setter Property="ToolTip" 
10                           Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
11                         </Trigger>
12                     </Style.Triggers>
13                 </Style>
14             </TextBox.Style>
15             <TextBox.Text>
16                 <Binding Source="{StaticResource CustomerInstance}"  Path="Age"  UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
17                 </Binding>
18             </TextBox.Text>
19         </TextBox>
复制代码

   2.1 验证绑定资源

 

复制代码
 1   public  class Customer : System.ComponentModel.IDataErrorInfo
 2     {
 3         public string this[string columnName]
 4         {
 5             get
 6             {
 7                 string result = string.Empty;
 8 
 9                 if (columnName == "FirstName")
10                 {
11                     if (string.IsNullOrWhiteSpace(FirstName))
12                     {
13                         result = "Name cannot null or empty.";
14                     }
15                 }
16 
17                 else if (columnName == "Age")
18                 {
19                     if (Age < 0||Age>100)
20                     {
21                         result = "请设定0-100之间的值";
22                     }
23                 }
24 
25                 return result;
26             }
27         }
28 
29         public string Error
30         {
31             get
32             {
33                 return string.Empty;
34             }
35         }
36 
37         public string FirstName
38         {
39             get;
40             set;
41         }
42 
43         public int Age
44         {
45             get;
46             set;
47         }
48     }
复制代码

 

posted @   懒树懒  阅读(27)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示