WPF使用IDataErrorInfo进行数据校验
这篇博客将介绍如何使用IDataErrorInfo进行数据校验。下面直接看例子。一个Customer类,两个属性(FirstName, Age)
class Customer { public string FirstName { get; set; } public int Age { get; set; } }
将Customer类继承IDataErrorInfo,并实现它的属性。
class Customer : System.ComponentModel.IDataErrorInfo { public string this[string columnName] { get { string result = string.Empty; if(columnName == "FirstName") { if(string.IsNullOrWhiteSpace(FirstName)) { result = "Name cannot null or empty."; } } else if(columnName == "Age") { if(Age < 0) { result = "Age cannot less then zero."; } } return result; } } public string Error { get { return null; } } public string FirstName { get; set; } public int Age { get; set; } }
在UI中绑定Customer的FirstName,Age属性,并且当出现错误数据时触发验证。
<Window.Resources> <local:Customer x:Key="CustomerInstance" FirstName="Sam Bent" Age="24" /> <ControlTemplate x:Key="TextBoxErrorTemplate"> <Grid> <Border BorderBrush="Blue" BorderThickness="1"> <AdornedElementPlaceholder/> </Border> </Grid> </ControlTemplate> </Window.Resources> <StackPanel Margin="10"> <TextBox Text="{Binding Source={StaticResource CustomerInstance}, Path=FirstName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" Validation.ErrorTemplate="{x:Null}" Margin="0,5" /> <TextBox Text="{Binding Source={StaticResource CustomerInstance}, Path=Age, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"> <TextBox.Style> <Style TargetType="{x:Type TextBox}"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="Background" Value="Red" /> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> </Trigger> </Style.Triggers> </Style> </TextBox.Style> </TextBox> </StackPanel>
将Customer的FirstName与Age属性分别绑定在两个TextBox中,设置ValidatesOnDataErrors=True来触发验证。将错误信息绑定在TextBox的ToolTip属性上,
ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" 或者
ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"或者
<Style TargetType="{x:Type TextBox}"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="Background" Value="Red" /> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> </Trigger> </Style.Triggers> </Style>
另外可以对ErrorTemplate进行定制,例如上面代码中的TextBoxErrorTemplate。
运行结果:
代码点击这里下载,感谢您的阅读。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?