当前位置: 首页 > news >正文

【WPF】使用Behavior以及ValidationRule实现表单校验

文章目录

  • 使用ValidationRule实现检测用户输入
    • EmptyValidationRule 非空校验
    • TextBox设置非空校验
    • TextBox设置非空校验并显示校验提示
  • 结语

使用ValidationRule实现检测用户输入

EmptyValidationRule是TextBox内容是否为空校验,TextBox的Binding属性设置ValidationRule后,TextBox将自带校验红框效果。但是默认是没有报错提示的。需要开启验证错误的通知属性 NotifyOnValidationError,这样可以通过绑定 Validation.Error 事件处理程序获取到Message进行提示

EmptyValidationRule 非空校验

public class EmptyValidationRule : ValidationRule
{public override ValidationResult Validate(object value, CultureInfo cultureInfo){string str = value as string;if (string.IsNullOrWhiteSpace(str)){return new ValidationResult(false, "不能为空,输入有效值");}return ValidationResult.ValidResult;}
}

TextBox设置非空校验

UpdateSourceTrigger="PropertyChanged" 设置每次输入都触发双向绑定,Binding.ValidationRules 设置校验逻辑
ValidatesOnTargetUpdated="True" 设置 首次加载就校验(默认启动程序的时候不开启校验,当你第一次输入才校验)

<StackPanelGrid.Row="1"HorizontalAlignment="Center"Orientation="Horizontal"><TextBlock VerticalAlignment="Center" Text="年龄:" /><TextBoxWidth="200"Height="30"Margin="10,0"VerticalAlignment="Center"VerticalContentAlignment="Center"><TextBox.Text><Binding Path="Age" UpdateSourceTrigger="PropertyChanged"><Binding.ValidationRules><Valid:EmptyValidationRule ValidatesOnTargetUpdated="True" /></Binding.ValidationRules></Binding></TextBox.Text></TextBox>
</StackPanel>

在这里插入图片描述
在这里插入图片描述

TextBox设置非空校验并显示校验提示

按照上述说明的【需要开启验证错误的通知属性 NotifyOnValidationError,这样可以通过绑定 Validation.Error 事件处理程序获取到Message进行提示】
这边采用的是WPF的行为Behavior。

  1. 首先先定义一个行为 ValidationExceptionBehavior
public class ValidationExceptionBehavior : Behavior<FrameworkElement>
{// 实现你的行为逻辑protected override void OnAttached(){// 在此处理附加逻辑// AssociatedObject 就是 行为的对象 FrameworkElementAssociatedObject.AddHandler(Validation.ErrorEvent, new EventHandler<ValidationErrorEventArgs>(OnValidationError));}protected override void OnDetaching(){// 在此处理分离逻辑//移除 Validation.Error 事件监听this.AssociatedObject.RemoveHandler(Validation.ErrorEvent, new EventHandler<ValidationErrorEventArgs>(OnValidationError));}private void OnValidationError(object sender, ValidationErrorEventArgs e){MainViewModel mainModel = null;if (AssociatedObject.DataContext is MainViewModel){mainModel = this.AssociatedObject.DataContext as MainViewModel;}if (mainModel == null) return;//OriginalSource 触发事件的元素var element = e.OriginalSource as UIElement;if (element == null) return;//ValidationErrorEventAction.Added  表示新产生的行为if (e.Action == ValidationErrorEventAction.Added){// EmptyValidationRule返回的结果字符串string error = e.Error.ErrorContent.ToString();mainModel.ErrorMsg = error;}else if (e.Action == ValidationErrorEventAction.Removed) //ValidationErrorEventAction.Removed  该行为被移除,即代表验证通过{mainModel.ErrorMsg = string.Empty;}}}
  1. TextBox的Binding属性中的NotifyOnValidationError="True",开启验证错误的通知属性,产生 Validation.Error 事件。
<StackPanelGrid.Row="1"HorizontalAlignment="Center"Orientation="Horizontal"><TextBlock VerticalAlignment="Center" Text="年龄:" /><TextBoxWidth="200"Height="30"Margin="10,0"VerticalAlignment="Center"VerticalContentAlignment="Center"><TextBox.Text><BindingNotifyOnValidationError="True"Path="Age"UpdateSourceTrigger="PropertyChanged"><Binding.ValidationRules><Valid:EmptyValidationRule ValidatesOnTargetUpdated="True" /></Binding.ValidationRules></Binding></TextBox.Text></TextBox><!--  显示校验异常内容  --><LabelMinWidth="100"VerticalAlignment="Center"VerticalContentAlignment="Center"Content="{Binding ErrorMsg}"FontSize="15"Foreground="Red" />
</StackPanel>
  1. 绑定行为
    引入命名空间 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    绑定行为
<i:Interaction.Behaviors><Valid:ValidationExceptionBehavior />
</i:Interaction.Behaviors>

在这里插入图片描述

效果
在这里插入图片描述
在这里插入图片描述

结语

校验异常可以有多种展现形式和方法。
可以在提交按钮时候,判断异常字符串是否为空,不为空弹窗。
可以行为中使用GalaSoft.MvvmLight中的Messenger进行发布订阅(注册消费)。
例如下面这样
当ErrorMsg被赋值时,会触发 Messenger.Default.Send
在这里插入图片描述
ViewModol中

public string ErrorMsg
{get { return _errorMsg; }set{_errorMsg = value;if (!string.IsNullOrWhiteSpace(_errorMsg)){// 发送消息Messenger.Default.Send<string, MainView>(_errorMsg);}RaisePropertyChanged();}
}

在页面初始化时注册弹窗事件
在这里插入图片描述

效果
在这里插入图片描述

相关文章:

  • 亚马逊云科技 re:Invent 大会 - ElastiCache Serverless 模式来袭
  • 线性代数基础【3】向量
  • Datawhale聪明办法学Python(竞赛题解版)
  • HBase基础知识(七):HBase 性能优化示例全解
  • isp代理/双isp代理/数据中心代理的区别?如何选择?
  • 智能三维数据虚拟现实电子沙盘
  • 图片素材管理软件Eagle for mac提高素材整理维度
  • 详解Keras3.0 Layer API: LSTM layer
  • 直接插入排序和希尔排序
  • GPT在企业自动化方面的应用
  • Linux账号和权限管理
  • Linux - 记录问题:Ubuntu查看文件夹大小
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)
  • 代码随想录算法训练营第二十七天 | 回溯算法part4
  • alertmanage调用企业微信告警(k8s内部署)
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 3.7、@ResponseBody 和 @RestController
  • 4. 路由到控制器 - Laravel从零开始教程
  • create-react-app项目添加less配置
  • CSS相对定位
  • Debian下无root权限使用Python访问Oracle
  • Docker容器管理
  • Effective Java 笔记(一)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java编程基础24——递归练习
  • Java读取Properties文件的六种方法
  • java小心机(3)| 浅析finalize()
  • JAVA之继承和多态
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Solarized Scheme
  • 初识MongoDB分片
  • 多线程事务回滚
  • 蓝海存储开关机注意事项总结
  • 前端js -- this指向总结。
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我建了一个叫Hello World的项目
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (2)nginx 安装、启停
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (一)基于IDEA的JAVA基础12
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .Net IE10 _doPostBack 未定义
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 指南:抽象化实现的基类
  • .NET 中的轻量级线程安全
  • .NET4.0并行计算技术基础(1)
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net下简单快捷的数值高低位切换
  • .Net中的集合
  • @EnableWebMvc介绍和使用详细demo