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 }
重复就是力量,数量堆死质量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)