WPF中的数据验证
数据验证
WPF的Binding使得数据能够在数据源和目标之间流通,在数据流通的中间,便能够对数据做一些处理。
数据转换
和数据验证
便是在数据从源到目标 or 从目标到源 的时候对数据的验证和转换。
ValidationRule 验证规则
WPF中提供了一个抽象类ValidationRule
,我们自定义的验证规则都需要继承它,然后实现它的抽象
方法Validate
,该方法需要返回一个ValidationResult对象来表示验证结果。举个例子,一个验证数字
的规则(输入的只能是数字)
public class NumberValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (Regex.IsMatch(value.ToString(), "^[0-9]+$"))
{
return new ValidationResult(true, null);
}
else
{
return new ValidationResult(false, "请输入数字");
}
}
}
其中ValidationRule的两个属性
- ValidatesOnTargetUpdated
该属性可以确定验证的方向,如果设置为false,那么只验证从目标到源的方向,如果为True,
那么同时也会验证从源到目标的方向
- ValidationStep
该属性确定了验证的时机,它是一个枚举值
1 CommittedValue,该值提交到数据源后,运行ValidationRule,即不管验证是否能通过,属性都会被更新
2 ConvertedProposedValue,在进行了转换之后,运行ValidationRule,如果有数据转换,那么先转换再验证
3 RawProposedValue,在任何转换发生之前,运行ValidationRule
4 UpdatedValue,在更新了源后,运行ValidationRule,即属性值被更改之后,就会去验证,注意需要
ValidatesOnTargetUpdated
设置为True
还需要注意的是Binding对验证结果的处理,NotifyOnValidationError
设置为True,即当发生验证
错误时,错误信息会从目标沿着可视树往上冒泡
,直到该冒泡事件被侦听到并被处理。
<TextBox Grid.Row="1">
<TextBox.Text>
<Binding Path="Number" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource Converter}" NotifyOnValidationError="True">
<Binding.ValidationRules>
<validationRules:NumberValidationRule ValidatesOnTargetUpdated="True" ValidationStep="CommittedValue"></validationRules:NumberValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
当出现验证错误时,TextBox就会有一个红色的框,这是默认的错误模板样式,我们如何定义一个错误模板(ErrorTemplate)呢
错误模板 ErrorTemplate
<ControlTemplate x:Key="ErrorTemplate">
<StackPanel Orientation="Horizontal">
<AdornedElementPlaceholder x:Name="Placeholder"></AdornedElementPlaceholder>
<TextBlock Foreground="Red" Text="{Binding ElementName=Placeholder,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" FontSize="20" x:Name="txt"></TextBlock>
</StackPanel>
</ControlTemplate>
<TextBox Grid.Row="1" Height="30" Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
AdornedElementPlaceholder表示一个占位符,这里表示具体的控件即TextBox,这里表示错误模板的布局是
如果有验证错误,那么在TextBox的后边会有一个TextBlock文本,文本的内容显示的是验证错误的信息。
Validation
这里涉及到了一个类Validation
,它是一个静态类,它的使用大多以附加属性出现。它的主要功能是
1 设置ErrorTemplate
2 判断是否有错误(HasError),以及获取错误列表(Errors)
3 侦听验证错误事件
前两点前面都有提到,现在来看下 侦听验证错误冒泡事件
<Grid Grid.Row="1" Validation.Error="Validation_OnError">
<TextBox Height="30" Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
<TextBox.Text>
<Binding Path="Number" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
<Binding.ValidationRules>
<validationRules:NumberValidationRule></validationRules:NumberValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Grid>
private void Validation_OnError(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
//todo:新的验证错误
_errorMessage = e.Error.ErrorContent.ToString();
}
else
{
//todo:清除原有错误
_errorMessage = string.Empty;
}
}
这里需要注意的其实就是ValidationErrorEventAction
这个枚举值,因为产生新的验证错误,和清除
原来的验证错误都会触发这个事件,所以需要区分开来对待。
至此,WPF中的数据验证差不多了。
WPF中的数据验证的更多相关文章
- WPF中的数据模板(DataTemplate)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate) ...
- Java中的数据验证
原文链接:https://www.cuba-platform.com/blog/2018-10-09/945 翻译:CUBA China CUBA-Platform 官网 : https://www. ...
- WPF中的数据模板(DataTemplate)
原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate) ...
- WPF中的数据模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用
在WPF中,数据模板是非常强大的工具,他是一块定义如何显示绑定的对象的XAML标记.有两种类型的控件支持数据模板:(1)内容控件通过ContentTemplate属性支持数据模板:(2)列表控件通过I ...
- 在kettle中实现数据验证和检查
在kettle中实现数据验证和检查 在ETL项目,输入数据通常不能保证一致性.在kettle中有一些步骤能够实现数据验证或检查.验证步骤能够在一些计算的基础上验证行货字段:过滤步骤实现数据过滤:jav ...
- [WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点
1. 需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 Vie ...
- WPF中DATAGRID自定义验证(包含BINDINGGROUP)
DataGrid在Wpf中的应用是十分广泛的,当你需要表中的信息稍详细的显示出来时,或者我们需要进行某些数据输入时,都有可能采用DataGrid.当然对信息的显示,我们不需要进行验证,但当我们将Dat ...
- .NET MVC中的数据验证
一 概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...
- wpf中的数据模板
wpf中的模板分为数据模板和控件模板,我们可以通过我们自己定制的数据模板来制定自己想要的数据表现形式.例如:时间的显示可以通过图片,也可以通过简单数字表现出来. 例如: (1)先在Demo这个命名空间 ...
随机推荐
- .Net魔法堂:提取注释生成API文档
一.前言 在多人协作的项目中,除了良好的代码规范外,完整的API文档也相当重要.通过文档我们快速了解系统各模块的实际接口,及其使用场景.使用示例,一定程度上降低沟通成本,和减少后期维护中知识遗失等风险 ...
- Symantec Backup Exec 报"Access denied to directory xxx" Error Code E0008488
使用Symantec Backup Exec将几台Linux服务器上的RMAN备份收带时,偶尔会遇到作业备份失败的情况,检查Job History,就会发现有“Access denied to dir ...
- list、set、map、array间的相互转换
list.set.map.array间的相互转换 list转set Set set = new HashSet(new ArrayList()); set转list List list = new A ...
- DGbroker主备切换
1.检查DG是否正常 DGMGRL> show configuration; Configuration - dgc Protection Mode: MaxProtection Databas ...
- Linux软件的卸载
configure作用:是源码安装软件时配置环境用的 他根据你的配置选项和你的系统情况生成makefile文件 为make 做准备 最常用的参数: ./configure --prefix 作用: 不 ...
- 设计模式C#实现(十一)——组合模式
意图 0 适用性 1 结构 2 实现 3 效果 4 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 适用性 你想表示对象的部 ...
- Linux下Awk详解(转载)
什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...
- LINUX运维实战案例之文件已删除但空间不释放问题的分析与解决办法
1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空间了,如下图所示: 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,我们的线上服务器所 ...
- Vim命令大全
1.进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于 ...
- SmartPointer Smar指针
#include<iostream> using namespace std; // private class for use by HasPtr only class U_Ptr { ...