【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();}
}

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

效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华锐视点为广汽集团打造VR汽车在线展厅,打破地域限制,尽享购车乐趣

随着科技的飞速发展&#xff0c;我们正在进入一个全新的时代——元宇宙时代。元宇宙是一个虚拟的世界&#xff0c;它不仅能够模拟现实世界&#xff0c;还能够创造出现实世界无法实现的事物。而汽车行业作为人类生活的重要组成部分&#xff0c;也在积极探索与元宇宙的融合&#…

[数据结构]树与二叉树的性质

文章目录 0.二叉树的形态和基本性质1.完全二叉树的叶子节点个数2.树的叶子节点个数3.线索二叉树4.树和森林和二叉树5.平衡二叉树的最少结点数6.树/二叉树/森林的转换 0.二叉树的形态和基本性质 一棵二叉树具有5中基本形态n个结点可以构造的二叉树种数: C2n-n/n1 一棵树 n个结点…

SpringBoot3 整合Kafka

官网&#xff1a;https://kafka.apache.org/documentation/ 消息队列-场景 1. 异步 2. 解耦 3. 削峰 4. 缓冲 消息队列-Kafka 1. 消息模式 消息发布订阅模式&#xff0c;MessageQueue中的消息不删除&#xff0c;会记录消费者的偏移量 2. Kafka工作原理 同一个消费者组里的消…

Volume Control 2

为游戏添加音乐和音效总是需要一些编码来设置一个系统来控制、显示和保存应用程序的音量设置。 音量控制的设计是为了立即为您设置这些内容,让您有更多时间专注于最重要的事情——制作出色的游戏! 在版本2中,我们对系统进行了重新设计,使其更加模块化、灵活,甚至更易于使用…

工具系列:TimeGPT_(1)获取token方式和初步使用

文章目录 介绍获取Token用法数据的重要要求使用DateTime索引推断频率。 介绍 Nixtla的TimeGPT是一种用于时间序列数据的生成式预训练预测模型。TimeGPT可以在没有训练的情况下&#xff0c;仅使用历史值作为输入&#xff0c;为新的时间序列生成准确的预测。TimeGPT可以用于各种…

ubuntu磁盘管理常用命令

写的不全&#xff0c;后面随时修改。 Linux 磁盘管理常用三个命令为 df、du 和 fdisk。 df&#xff08;英文全称&#xff1a;disk free&#xff09;&#xff1a;列出文件系统的整体磁盘未使用量du&#xff08;英文全称&#xff1a;disk used&#xff09;&#xff1a;检查磁盘空…

如何避免卡尔曼滤波器的发散? Q P R参数怎么调?

文章目录 1.什么是发散2.发散的原因3.解决方法4.参数意义及调试方法5.工程经验(1)抑制P矩阵发散(2)抑制K矩阵发散1.什么是发散 当滤波的实际误差远远超过滤波误差的允许范围,甚至于趋向无穷大,使得滤波器推动作用,这种现象叫做滤波的发散。 2.发散的原因 (1)系统的…

【PID精讲12】基于MATLAB和Simulink的仿真教程

文章目录 写在前面一、基于Simulink的仿真1. 新建Simulink模型2. 保存Simulink模型3. 建模4. 运行二、基于MATLAB的仿真1. 编码2. 运行3. 调整曲线格式4. 导出图窗写在前面 第11讲介绍的连续系统的数字PID仿真是基于 Matlab的 M 语言实现的,对于初学者或者工程应用人员来说,…

Bytebase:统一数据库 CI/CD 解决方案 | 开源日报 No.128

bytebase/bytebase Stars: 7.9k License: NOASSERTION Bytebase 是一个数据库 CI/CD 解决方案&#xff0c;为开发人员和 DBA 提供统一的工具来管理不同数据库系统的开发生命周期。其主要功能包括标准化操作流程、SQL 代码审查、GitOps 集成以及数据访问控制等。关键特性和核心…

关于edge浏览器以及插件推荐

目录 广告拦截和隐私工具 密码管理器 生产力和组织工具 写作和语法工具 购物助手 娱乐和个性化 安全性和VPN 开发者工具 其他实用工具 Microsoft Edge 是一款基于Chromium开源项目的现代网络浏览器&#xff0c;由微软开发。它是Internet Explorer的继任者&#xff0c;…

QT 输入框输入限制 正则表达式限制 整理

在使用 输入数值时&#xff0c;经常遇到限制其范围的需要&#xff0c;比如角太阳高度角范围为[-90,90]&#xff0c;经度值范围[-180,180]&#xff0c;方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围&#xff0c;如使用QIntValidator限制整数…

TypeScript学习笔记归纳(先做基础梳理,后期不断丰满,持续更新ing)

文章目录 前言 二、TypeScript的优势体现在哪里&#xff1f; 1、执行时间上的区别 2、基础数据类型区别 3、TS优势 三、TypeScript的关键特性 四、TypeScript的类型系统 1、什么是类型注释&#xff1f; 2、类型系统核心 - 常用类型 1&#xff09; 基本类型&#xff0…

计网03-数据的封装和解封装

数据封装和解封装的过程 实例&#xff1a;有两台电脑 PC&#xff11;和PC&#xff12;&#xff0c;PC1要给PC&#xff12;发送一个文本文件 1、数据的封装过程&#xff1a; 应用层&#xff1a;将原始数据转换成计算机能识别的二进制数传输层&#xff1a;在传输层是有固定的传…

智能,轻量,高效的爬虫工具 (爬虫宝第一代), HSpider

场景 之前玩爬虫宝一时爽&#xff0c;但是我很快发现了一个致命的问题。就是chat3.5 有时候误判&#xff0c;Claude2 是遇到大一点的html就无法解析&#xff0c;chat4 Api没有申请下来&#xff0c;chat3.5 误判这个可以纠正&#xff0c;但是每次爬取花费的钱都是2刀以上&#…

springboot 查询

ServiceImpl中 getBaseMapper()的使用 public IPage<ProductPageVO> getProductPage(Integer regionOrCityCode, Integer brandId, LocalDate usedDate, Page<ProductPageVO> page) {return getBaseMapper().getProductPage(regionOrCityCode, brandId, usedDate, …

为什么说依赖抽象就变得更加灵活呢?举例

说依赖抽象变得更加灵活的主要原因在于它提供了更大的替换和扩展的空间。让我们通过一个简单的例子来说明&#xff1a; 考虑一个电商系统&#xff0c;其中有一个OrderProcessor类负责处理订单&#xff0c;它依赖于一个PaymentGateway用于处理支付。最初的设计可能如下所示&…

MacOS安装PHP5.6的Redis扩展

更多版本下载地址&#xff1a;https://pecl.php.net/package/redis 安装步骤 wget http://pecl.php.net/get/redis-2.2.7.tgztar -zxvf redis-2.2.7.tgzcd redis-2.2.7phpize./configure --with-php-config/usr/local//php/5.6.40/bin/php-configmake && make instal…

LabVIEW进行激光斑点图像处理与分析

LabVIEW进行激光斑点图像处理与分析 近年来&#xff0c;激光技术的应用日益繁荣。激光光斑的质量评估和分析技术决定了应用效果&#xff0c;对机器视觉、武器装备、光学测量和医疗设备产生深远影响。就具体用途和技术而言&#xff0c;激光光斑的采集和处理至关重要。即插即用的…

前端-部署配置前端项目时,关于env.development、env.production以及nginx.conf的关系

今天要打包前端项目生产镜像部署&#xff0c;学习到了关于env.development、env.production以及nginx.conf的关系 env.development 首先是env.development&#xff0c;这里面主要放的是我们本地开发时的代理服务器&#xff08;需要代理来解决跨域问题的话&#xff09; env.p…

渗透测试 | php的webshell绕过方法总结

目录 1.php的异或运算 2.通过获取注释去绕过 3.利用字符的运算符​​​​​​​ 4.通过end函数代替[] 5.通过常量去绕过 6.字符串拼接双美元符 7.通过函数定义绕过 8.通过类定义&#xff0c;然后传参分割 9.多传参方式绕过​​​​​​​ 10.通过get_defined_function…