WPF---数据绑定之ValidationRule数据校验(六)

2023-10-27

一、概述

我们知道,Binding好比架设在Source和Target之间的桥梁,数据可以借助这个桥梁进行流通。在数据流通的过程中,我们可以在Binding这座桥梁上设置关卡,对数据的有效性进行验证。

二、验证方法

我们利用Binding的ValidationRules(类型为Collection<ValidationRule)对数据进行验证。从它的名称和类型可以得知,我们可以为每个Binding设置多个数据校验条件,每个条件是一个

ValidationRule对象,ValidationRule类是个抽象类,使用的时候,我们需要创建它的派生类并实现它的Validate方法

Validate方法返回值是ValidationResult类型对象,如果校验通过,需要把ValidationResult对象的IsValid属性设置为true,反之,设置false并为其ErrorContent属性设置一个合适的消息内容,一般情况下是一个字符串。

三、例子

Demo1

假设UI上有一个Slider和一个TextBox,我们以Slider为源,TextBox为Target,Slider的取值范围为0~100,也就是说我们要需要校验TextBox中输入的值是不是在1~100这个范围内。

 1 using System.Globalization;
 2 using System.Windows;
 3 using System.Windows.Controls;
 4 
 5 namespace BindingDemo4ValidationRule
 6 {
 7     /// <summary>
 8     /// Interaction logic for MainWindow.xaml
 9     /// </summary>
10     public partial class MainWindow : Window
11     {
12         public MainWindow()
13         {
14             InitializeComponent();
15         }
16     }
17     public class RangeValidationRule:ValidationRule
18     {
19         public override ValidationResult Validate(object value, CultureInfo cultureInfo)
20         {
21             double myValue = 0;
22             if(double.TryParse(value.ToString(),out myValue))
23             {
24                 if (myValue >= 0 && myValue <= 100)
25                 {
26                     return new ValidationResult(true, null);
27                 }
28             }
29             return new ValidationResult(false, "Input should between 0 and 100");
30         }
31     }
32 }
View Code
 1 <Window x:Class="BindingDemo4ValidationRule.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:BindingDemo4ValidationRule"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="350" Width="525">
 9     <Grid>
10         <Slider Margin="10,120,-10,-120" Minimum="0" Maximum="100" Name="slider" Value="10"></Slider>
11         <TextBox Height="50" Margin="5,30,5,240" >
12             <TextBox.Text>
13                 <Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged">
14                     <Binding.ValidationRules>
15                         <local:RangeValidationRule/>
16                     </Binding.ValidationRules>
17                 </Binding>
18             </TextBox.Text>
19         </TextBox>
20       
21     </Grid>
22 </Window>
View Code

运行结果如下:

 从结果中可以看出,当我们在TextBox中输入的值不在0~100的范围内的时候,TextBox会显示红色边框,提示值是错误的。

 

Demo2

默认情况下,Binding校验默认来自Source的数据总是正确的,只有来自Target的数据(Target多为UI控件,等价于用户的输入)才有可能出现问题,为了不让有问题的数据污染Source,所以需要校验。换句话说,Binding只在Target被外部更新时候进行校验,而来自Binding的Source数据更新Target时是不会进行校验的。

当来自Source的数据也有可能出现问题的时候,我们需要将校验条件的ValidatesOnTargetUpdated属性设置为true。

我们把Xaml代码改为以下的时候,会发现当移动滑动条在0以下或者100以上的时候,TextBox边框也会变成红色。

 1 <Window x:Class="BindingDemo4ValidationRule.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:BindingDemo4ValidationRule"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="350" Width="525">
 9     <Grid>
10         <Slider Margin="10,120,10,-120" Minimum="-10" Maximum="110" Name="slider" Value="10"></Slider>
11         <TextBox Height="50" Margin="5,30,5,240" >
12             <TextBox.Text>
13                 <Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged">
14                     <Binding.ValidationRules>
15                         <local:RangeValidationRule ValidatesOnTargetUpdated="True"/>
16                     </Binding.ValidationRules>
17                 </Binding>
18             </TextBox.Text>
19         </TextBox>
20       
21     </Grid>
22 </Window>

Demo3

当校验发生错误的时候,Validate方法返回的ValidationResult对象会携带一条错误消息,下面我们就要显示这个错误消息。

为了达到这个目的,我们需要把Binding的NotifyOnValidationError属性设置为true,这样当数据校验失败的时候,Binding会像报警一样发出一个信号,这个信号会以Binding对象的Target为起点在UI树上传播,如果某个节点上设置了对这种信号的侦听器,那么这个侦听器就会触发来处理这个信号。详细参加以下代码:

 1 using System.Globalization;
 2 using System.Windows;
 3 using System.Windows.Controls;
 4 
 5 namespace BindingDemo4ValidationRule
 6 {
 7     /// <summary>
 8     /// Interaction logic for MainWindow.xaml
 9     /// </summary>
10     public partial class MainWindow : Window
11     {
12         public string TipMessage
13         {
14             get { return (string)GetValue(TipMessageProperty); }
15             set { SetValue(TipMessageProperty, value); }
16         }
17 
18         // Using a DependencyProperty as the backing store for TipMessage.  This enables animation, styling, binding, etc...
19         public static readonly DependencyProperty TipMessageProperty =
20             DependencyProperty.Register("TipMessage", typeof(string), typeof(MainWindow), new PropertyMetadata("Tip"));
21 
22         public MainWindow()
23         {
24             InitializeComponent();
25             this.DataContext = this;
26         }
27 
28         private void tbx1_Error(object sender, ValidationErrorEventArgs e)
29         {
30             if (Validation.GetErrors(tbx1).Count > 0)
31             {
32                 TipMessage = Validation.GetErrors(tbx1)[0].ErrorContent.ToString();
33             }
34             else
35             {
36                 TipMessage = "";
37             }
38         }
39     }
40     public class RangeValidationRule : ValidationRule
41     {
42         public override ValidationResult Validate(object value, CultureInfo cultureInfo)
43         {
44             double myValue = 0;
45             if (double.TryParse(value.ToString(), out myValue))
46             {
47                 if (myValue >= 0 && myValue <= 100)
48                 {
49                     return new ValidationResult(true, null);
50                 }
51             }
52 
53             return new ValidationResult(false, "Input should between 0 and 100");
54         }
55     }
56 }
View Code
 1 <Window x:Class="BindingDemo4ValidationRule.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:BindingDemo4ValidationRule"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="350" Width="525">
 9     <Grid>
10         <Slider Margin="10,120,10,-120" Minimum="-10" Maximum="110" Name="slider" Value="10"></Slider>
11         <TextBox Height="50" Margin="5,30,5,240" Name="tbx1" Validation.Error="tbx1_Error">
12             <TextBox.Text>
13                 <Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
14                     <Binding.ValidationRules>
15                         <local:RangeValidationRule ValidatesOnTargetUpdated="True"/>
16                     </Binding.ValidationRules>
17                 </Binding>
18             </TextBox.Text>
19         </TextBox>
20         <Label Height="50" Margin="5,154,-5,116" Content="{Binding TipMessage}" Foreground="Red"> 
21             
22         </Label>
23       
24     </Grid>
25 </Window>
View Code

运行结果以下:

转载于:https://www.cnblogs.com/3xiaolonglong/p/9777063.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF---数据绑定之ValidationRule数据校验(六) 的相关文章

  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • Qt Desginer布局方法

    关于Qt Desginer中的布局方法 网上教程少之又少 个人经过反复的实践和摸索 觉得可以用一句话来概括 先不断地进行小布局 然后对整体进行大布局 先不断地进行小布局的目的就是将同为一组的控件按某个格式排列使界面干净有序 同时方便以后对整
  • Unity中Shader实现UI去色功能的实现思路

    文章目录 前言 一 在开发过程中 在UI中会涉及一些需要置灰UI的需求 有很多实现的方法 1 做两套纹理 通过程序控制切换 2 使用shader实现对纹理去色 二 这里主要记录用shader实现的思路 1 基础纹理的采样 2 支持组件中的调
  • 分享 20 道关于 React 开发相关的面试题及答案

    React 面试可能你会觉得有点吓人 为了帮助您自信并准备好迎接下一次面试 我们列出了 20 个常见的 React 问题和参考答案 希望通过本篇文章的内容 能够帮助你重新温习你的 React 知识 复习重要概念 并为你的下一次面试做好更充分
  • 24.qint64转QString 以及获取文件属性

    qint64转QString 1 qint64 size info size 2 qint64 转QString 3 QString size2 tr 1 arg size 获取文件属性 1 include mainwindow h 2 i
  • 前端自测.

    交互 宽度1200px 表单校验 长度 敏感词汇 初始化 loading 结果 空 表单重复提交 loading 请求拦截 限流 数字 大数据 千分位 文本长度 省略号 数据查询结果校验 按条件查询结果是否正确 空数据传参 xx 参数头尾有
  • web移动端布局的那些事儿

    原文地址 github com HuJiaoHJ bl web移动端布局范畴很广 其中比较基础的几个话题 移动端适配 1px border 基础布局 本文主要分享这三个话题 一 移动端适配 提起移动端适配 大家想到的肯定是rem flexi
  • android Scroller

    参考 http www linuxidc com Linux 2016 01 127276 htm 以前只知道怎么使用scroller 照猫画虎 复制粘贴 今天遇到使用scroller 还是要去搜索 这样不行 要搞懂原理 上面的博客写的很漂
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Android4.0 SDK功能详解

    我在eoe的论坛找到的 就复制过来了 跟大家分享一下 Android 4 0 平台API等级 14 Android 4 0 是一次重要的平台发布版 为用户和应用程序开发者增加了大量的新特性 在下面我们将讨论的所有新特性和API中 因为它将
  • UI自动化测试的正确姿势 —— Airtest设备连接&API详解第一篇

    一 背景 Airtest作为一款优秀的自动化测试工具 有着强大的API功能 处理日常自动化测试过程中需要的各类操作 今天就给大家逐一介绍关于设备连接和常用API部分 结合自动化测试中的各类需求 看看如何通过使用Airtest来快速实现 二
  • 基于Selenium和python的UI自动化测试方案

    一 概述 对于比较复杂的系统 每次有小的迭代测试同学不可能会把所有的流程验证一遍 如果开发无意改动影响了某些流程而测试又没测试到 就可能会出现生产问题 因此很有必要通过自动化的测试去确保系统的稳定性 自动化测试可以选择接口自动化测试和UI自
  • UI自动化测试方案

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 3k次 点赞60次 收藏8次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自动
  • vue element-ui el-tooltip组件失效问题

    引用自 https blog csdn net ygrhlh article details 121660806 vue element ui el tooltip组件失效问题 因为公司项目年代久远以及谷歌chrome 80 后的sames
  • app测试必掌握的核心测试:UI、功能测试!

    一 UI测试 UI即User Interface 用户界面 的简称 UI 设计则是指对软件的人机交互 操作逻辑 界面美观的整体设计 好的UI设计不仅是让软件变得有个性有品味 还要让软件的操作变得舒适 简单 自由 充分体现软件的定位和特点 手
  • Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验

    Axure RP 8 一款引领潮流的交互式原型设计工具 为设计师提供了无限的可能性 让他们能够创造出逼真的原型 从而更好地展示和测试他们的设计 Axure RP 8拥有丰富的功能和工具 让设计师可以轻松地创建出复杂的交互式原型 从简单的按钮
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • 界面控件DevExpress WPF属性网格 - 让应用轻松显示编辑各种属性事件

    DevExpress WPF Property Grid 属性网格 灵感来自于Visual Studio Visual Studio启发的属性窗口 对象检查器 让在WPF应用程序显示和编辑任何对象的属性和事件变得更容易 P S DevExp
  • 一文从0到1手把手教学UI自动化测试之数据驱动!

    在UI的自动化测试中 我们需要把测试使用到的数据分离到文件中 如果单纯的写在我们的测试模块里面 不是一个好的设计 所以不管是什么类型的自动化测试 都是需要把数据分离出来的 当然分离到具体的文件里面 文件的形式其实有很多的 这里主要说明JSO

随机推荐

  • oracle insert into select 大数据量_Oracle的批量插入操作

    MySQL中支持一条SQL语句执行批量插入 Oracle中支持的形式有些不同 但是殊途同归 用的就是insert all into语法 创建测试表 SQL gt create table a1 id number a varchar2 1
  • 苹果手机怎么升级鸿蒙系统,鸿蒙2.0首个升级版本 与苹果的iOS14.3的安装包相当...

    华为如果失去了自研芯片 与国内其他手机厂商就没有区别了吗 并不是这样 与其他手机厂商完全依赖国外资源 仅仅只是组装零件不同 华为在没有自研芯片后 还有自研的鸿蒙系统 在去年年底华为就发布了鸿蒙2 0系统的测试版本 允许开发者自行申请进行测试
  • 时间序列概念及主要模型(白噪声,AR, MA, ARMA, ARIMA)

    时间序列分析 时间序列是按照时间顺序 按照一定时间间隔取得的一系列观测值 怎样做时间序列分析 时间序列分析尝试找出序列值在过去呈现的特征模式 假定这种模式在未来能够持续 进而对未来进行预测 时间序列基本特征 趋势性 序列相关性 随机性 时间
  • 老毛桃通过虚拟光驱安装Window10

    1 电脑插入老毛桃启动进入winPE 2 点击 开始 所有程序 磁盘管理 虚拟磁盘驱动器 2 打开后点击挂载 选择映像文件 即U盘里面的iso文件 右下角选择只读媒体 点击确定 关闭窗口 3 点击 开始 所有程序 安装维护 WinNTSet
  • Keil 出现报错:undefined symbol

    这个问题的意思是出现未定义的符号 主要有下面两种解决方式 目录 c文件没有添加进路径 工程文件没有添加 c文件没有添加进路径 出现这个问题首先看一下是不是 c文件没有添加进路径 我们写好了 c文件之后 保存在文件夹里 还需要文件夹里的 c文
  • 支付全流程的测试

    聚合支付与微信和支付宝区别与联系 聚合支付 支付宝和微信扫同一个二维码都可以支付 支持多种支付方式 聚合支付是与多方合作的平台 支付宝 微信 京东 有合作关系 支付宝 微信 京东 为第三方持牌照 支付牌照 机构 为什么要使用聚合支付方式 统
  • 学习FPGA之四:FPGA开发方法

    FPGA是一个很特殊的芯片 可能在2个月前 我还对它一无所知 我们熟知的芯片都是CPU GPU 或者知道ASIC的概念 但实际上 FPGA已经走过了30个年头 它目前已经成为一个包含各种先进电路 逻辑单元 接口 芯片封装 制造等技术的 集大
  • 【MATLAB】模糊控制篇 常用隶属函数介绍和实现

    在Matlab中已经开发出了11种隶属函数 让初学模糊控制的同学容易一头雾水 到底这些隶属函数有什么区别 实现的函数效果是怎么样的 在实际应该怎么选择呢 matlab模糊控制器的隶属函数选择 Trimf 三角形隶属函数 Trapmf 梯形隶
  • cmd如何一次运行多行命令

    在使用sonar扫描本地代码时 需要在windows的中执行以下命令 mvn sonar sonar Dsonar projectKey compoment service Dsonar host url https sonar intra
  • 如何制作个人网站(如何搭建个人博客)

    本文共5220个字 预计阅读时间需要17分钟 所有文字摘自互联网 仅做配图处理 首先制作一个网站需要 域名即example com 虚拟空间或云服务器 网站代码制作工具或网站后台管理工具 你可以百度出模板 一定的编程技能和代码理解能力 优秀
  • 9个Linux 查看系统硬件信息命令(实例详解)

    在Linux下 我们精要遇到需要查看系统的硬件信息 这里我罗列了查看系统硬件信息的实用命令 并做了分类 实例解说 执行环境 ubuntu 16 04 1 cpu lscpu命令 查看的是cpu的统计信息 root ubuntu home p
  • Redis的使用

    使用之前记得启动redis服务并连接redis redis命令大全见如下连接 这里只给大家讲解一些常用的 redis命令手册https www redis net cn order 一 redis常用命令 1 对key操作的命令 1 查看所
  • CSR867x — sink工程的编译与下载(run)

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的话
  • 怎么使用amd加速_PR剪辑应该怎么选硬件?英特尔CPU和英伟达显卡最合适

    大家好 欢迎来到降频评测室 本文章是科普这么一个东西 不少剪辑师常用的pr 这款剪辑软件有一个英特尔的核显加速的功能 已经出来相当长的一段时间了 但就我的观察 了解的人不多 要讲核显加速 必须先说一个东西 Adobe水银回放引擎 还有叫水银
  • Hystrix使用说明,配置参数说明

    一 什么情况下会触发fallback方法 名字 描述 触发fallback EMIT 值传递 NO SUCCESS 执行完成 没有错误 NO FAILURE 执行抛出异常 YES TIMEOUT 执行开始 但没有在允许的时间内完成 YES
  • 排序算法 —— 希尔排序(图文超详细)

    文章目录 希尔排序 直接插入排序的优化 1 分组思想 2 缩小增量的过程 3 排序步骤 3 1 排序五组数据的情况 3 2 排序两组数据的情况 3 3 排序一组数据的情况 4 代码分析 4 1 如何设置数据组数 4 2 直接插入排序实现思路
  • Java变量的作用域

    Java变量的作用域 在java中 一个变量的作用域为大括号 出了大括号就被销毁 例如 public class Test public static void main String args int sum 0 for int i 0
  • 45黑马QT笔记之Qt下的Udp的广播和组播

    45黑马QT笔记之Qt下的Udp的广播和组播 1 广播 在使用QUdpSocket类的writeDatagram 函数发送数据的时候 其中第二个参数host应该指定为广播地址 QHostAddress Broadcast此设置相当于QHos
  • 大功率光伏应用不同多电平变换器拓扑的比较研究(Simulink)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink实现 1 概述 文献来源 摘要 本文研究了多电平变换器的现
  • WPF---数据绑定之ValidationRule数据校验(六)

    一 概述 我们知道 Binding好比架设在Source和Target之间的桥梁 数据可以借助这个桥梁进行流通 在数据流通的过程中 我们可以在Binding这座桥梁上设置关卡 对数据的有效性进行验证 二 验证方法 我们利用Binding的V