数据验证

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中的数据验证的更多相关文章

  1. WPF中的数据模板(DataTemplate)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate)        ...

  2. Java中的数据验证

    原文链接:https://www.cuba-platform.com/blog/2018-10-09/945 翻译:CUBA China CUBA-Platform 官网 : https://www. ...

  3. WPF中的数据模板(DataTemplate)

    原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate)                                                   ...

  4. WPF中的数据模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用

    在WPF中,数据模板是非常强大的工具,他是一块定义如何显示绑定的对象的XAML标记.有两种类型的控件支持数据模板:(1)内容控件通过ContentTemplate属性支持数据模板:(2)列表控件通过I ...

  5. 在kettle中实现数据验证和检查

    在kettle中实现数据验证和检查 在ETL项目,输入数据通常不能保证一致性.在kettle中有一些步骤能够实现数据验证或检查.验证步骤能够在一些计算的基础上验证行货字段:过滤步骤实现数据过滤:jav ...

  6. [WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点

    1. 需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 Vie ...

  7. WPF中DATAGRID自定义验证(包含BINDINGGROUP)

    DataGrid在Wpf中的应用是十分广泛的,当你需要表中的信息稍详细的显示出来时,或者我们需要进行某些数据输入时,都有可能采用DataGrid.当然对信息的显示,我们不需要进行验证,但当我们将Dat ...

  8. .NET MVC中的数据验证

    一  概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...

  9. wpf中的数据模板

    wpf中的模板分为数据模板和控件模板,我们可以通过我们自己定制的数据模板来制定自己想要的数据表现形式.例如:时间的显示可以通过图片,也可以通过简单数字表现出来. 例如: (1)先在Demo这个命名空间 ...

随机推荐

  1. 利用PHPMailer 来完成PHP的邮件发送

    翻起之前的代码看了一下,还是发表到这里,以后容易查找. 以下的两个文件在这里下载 http://download.csdn.net/detail/u013085496/9673828 也可以直接上gi ...

  2. ORA-00030: User session ID does not exist.

    同事在Toad里面执行SQL语句时,突然无线网络中断了,让我检查一下具体情况,如下所示(有些信息,用xxx替换,因为是在处理那些历史归档数据,使用的一个特殊用户,所以可以用下面SQL找到对应的会话信息 ...

  3. T-SQL性能调整(一)--编译和重新编译

    概念简介 我们平时所说的查询在SQLServer 中主要有两部分来实现: 编译查询,主要包括了五个环节(缓存查找.分析.代数化.优化.缓存新计划) 流程描述: 首先,在计划缓存中查找是否包含新的查询, ...

  4. 无法连接到WMI提供程序 三种解决办法

    无法连接到WMI 提供程序 请注意,你只能使用SQL Server 配置管理器来管理SQL Server 2005服务器.找不到指定的模块.[0x8007007e] 解决方案1: 检查一下 windo ...

  5. Tomcat源码分析之—组件启动实现分析

    Tomcat由多个组件组成,那么Tomcat是怎么对他们的生命周期进行管理的么,这里将从Tomcat源码去分析其生命周期的实现: Bootstrape类为Tomcat的入口,所有的组件够通过实现Lif ...

  6. android 实现ImageView按压效果和解决背景图片拉申问题

    建立一个.XML文件,名为:image_tab_bg.xml <?xml version="1.0" encoding="utf-8"?> < ...

  7. 用U盘制作启动盘后空间变小的恢复方法,清除U盘启动盘空间

    先把u盘插好,运行cmd, 输入diskpart,回车, (输入list disk,回车,能看到磁盘大致情况,u盘一般是磁盘1) 再输入select disk 1,回车, 再输入clean,回车, 关 ...

  8. 免费股票数据API接口

    免费股票数据API接口提供沪深.香港.美国股市信息. 1.沪深股市 2.香港股市 3.美国股市 4.香港股市列表 5.美国股市列表 6.深圳股市列表 7.沪股列表 API文档:https://www. ...

  9. linux下使用g++编译cpp工程

    C++编程中相关文件后缀 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #includ ...

  10. Stanford机器学习笔记-7. Machine Learning System Design

    7 Machine Learning System Design Content 7 Machine Learning System Design 7.1 Prioritizing What to W ...