WPF中TextBox的自动验证:

演示 :

用以下两个TextBox分别显示验证IP和非空值验证,先看效果:

IP自动验证效果:

非空值自动验证效果:

第一步:定义TextBox验证的样式:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style x:Key="ValidationTextBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right"
Foreground="Red" FontSize="" FontWeight="Bold"
ToolTip="{Binding ElementName=adornerPlaceholder,
Path=AdornedElement.(Validation.Errors)[].ErrorContent}">
*
</TextBlock>
<Border BorderBrush="Red" BorderThickness="" CornerRadius="">
<AdornedElementPlaceholder Name="adornerPlaceholder"></AdornedElementPlaceholder>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

第二步:绑定上面的样式:

<TextBox x:Name="TxDataBaseIP" Style="{DynamicResource ValidationTextBoxStyle}" .....

<TextBox x:Name="TbDataBaseAcount" Style="{DynamicResource ValidationTextBoxStyle}" ......

第三步:为Text的Text属性定义和添加验证规则:

定义验证规则:

using System.Text.RegularExpressions;
using System.Windows.Controls; namespace NCS.Client.WPF.Resources.Validations
{
public class NotNullValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (string.IsNullOrEmpty(value as string) || string.IsNullOrWhiteSpace(value as string))
{
return new ValidationResult(false, "不能为空!");
}
return new ValidationResult(true, null);
}
}
public class IPAddressRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
string IPAddress = value as string; if (!string.IsNullOrWhiteSpace(IPAddress))
{
string IPAddressFormartRegex = @"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$"; // 检查输入的字符串是否符合IP地址格式
if (!Regex.IsMatch(IPAddress, IPAddressFormartRegex))
{
return new ValidationResult(false, "IP地址格式不正确");
}
}
return new ValidationResult(true, null);
}
}
}

绑定规则:

                            <TextBox.Text>
                                <Binding Path="DataBaseIp" Mode="TwoWay"
                                     UpdateSourceTrigger="PropertyChanged">
                                    <Binding.ValidationRules>
                                        <validations:IPAddressRule/>
                                    </Binding.ValidationRules>
                                 </Binding>
                            </TextBox.Text>
                        <TextBox.Text>
<Binding Path="DataBaseAccount"
Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validations:NotNullValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>

完整的控件xaml代码:

                <StackPanel Orientation="Horizontal" Height="" VerticalAlignment="Top">
<TextBlock Text="数 据 库 IP" Width="" VerticalAlignment="Center"/>
<TextBox x:Name="TxDataBaseIP" Style="{DynamicResource ValidationTextBoxStyle}"
MaxWidth="" Width="" Height=""
HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBox.Text>
<Binding Path="DataBaseIp" Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validations:IPAddressRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="" VerticalAlignment="Top">
<TextBlock Text="数据库账户" Width="" VerticalAlignment="Center"/>
<TextBox x:Name="TbDataBaseAcount" Style="{DynamicResource ValidationTextBoxStyle}"
MaxWidth="" Width="" Height=""
HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBox.Text>
<Binding Path="DataBaseAccount"
Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validations:NotNullValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>

【the end】

后记:

1.有个缺陷的:一开始初始化界面的时候没有进行验证,必须是输入一次,以后才进行验证。如下图所示:

  2. 上面的文章描述是基于我的一个实际项目编写的,有网友可能需要源码,现在我从原来的项目中剥离出这部分知识的代码部分,所以下载到的源码与上述的代码的

命名空间不一致。

源码下载:

链接:http://pan.baidu.com/s/1jGE9V0q 密码:05g3

拓展学习:

  Regex Validation in WPF

  http://www.codeproject.com/Articles/15610/Regex-Validation-in-WPF

WPF 自动验证的更多相关文章

  1. ThinkPhp 3.2 自动验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 数据验证有两种方式: 静态方式:在模型类里面通过$_validate属性定义验证规则 ...

  2. tp框架之自动验证表单

    tp框架的create自动加载表单的方法可以自动根据自己定义的要求来验证表单里面的内容,但是由于是在后台执行代码,会拖慢程序运行速度,所以还是建议通过前端js来进行判断,后台只进行数据库的查询以及传值 ...

  3. thinkphp表单自动验证

    ThinkPHP框架表单验证 对注册到test表的表单进行验证 在注册之前要对表单进行验证: 用户名非空验证,两次输入密码必须一致即相等验证,年龄在18~50之间即范围验证,邮箱格式正则验证. 自动验 ...

  4. thinkphp自动验证---$_validate

    thinkphp中的自动验证 array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间]) 1.验证字段 需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段 ...

  5. 自动验证是ThinkPHP

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 数据验证有两种方式: 静态方式:在模型类里面通过$_validate属性定义验证规则 ...

  6. thinkphp中的自动验证

    array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间]) 1.验证字段 需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等.有 ...

  7. thinkphp自动验证中的静态验证和动态验证和批量验证

    1.静态定义 在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义. 举例说明,我们在模型类里面定义了$_validate属性如下: class UserModel extends Model ...

  8. Ajax实现提交表单时验证码自动验证(原创自Zjmainstay)

    本文通过源码展示如何实现表单提交前,验证码先检测正确性,不正确则不提交表单,更新验证码. 1.前端代码 index.html <!DOCTYPE html> <html> &l ...

  9. ThinkPHP 自动验证与自动填充无效可能的原因(转)

    自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() Think ...

随机推荐

  1. package.json文件特殊符号含义

    package.json文件里的^和~表示什么意思呢 In the simplest terms, the tilde matches the most recent minor version (t ...

  2. html调用commonjs规范的js

    a.js define(function(require, exports, module) { var test = function(){ console.log("hello worl ...

  3. 33、secret

    CemFjee9rueuoeeQhgkxCee9kee7nO+8jOW6lOeUqO+8jOaVsOaNruW6k+acjeWKoeeahOWFs+mUruS/oeaBr++8iOWmgiDmnI3l ...

  4. MySQL一对一:一对多:多对多

    学生表和课程表可以多对多 一个学生可以学多门课程 一门课程可以有多个学生: 多对多 *** 一个学生对应一个班级 一个班级对应多个学生: 一对多 *** 一个老师对应多个学生 多个学生对应一个老师:一 ...

  5. c语言入门-02-第一个c程序开始

    我们来开我们第一个c代码 #include<stdio.h> int main(){ // print num int num; num = 1; printf("%d\n&qu ...

  6. Wordpress Uncaught TypeError: b(...).not(...).filter(...).mediaelementplayer is not a function

    Wordpress 插件页面报错如下图: 原因及解决方法: 引入了两次 jquery.js 或 jquery.js 定义的变量导致报错,删除在插件页面自己引入的 jquery,js 即可解决报错. 大 ...

  7. Halcon18 Linux For Armv7a 下载

    Halcon18 Linux For Armv7a 下载地址:http://www.211xun.com/download_page_16.html HALCON 18 是一套机器视觉图像处理库,由一 ...

  8. [cocos2dx utils] cocos2dx读取,解析csv文件

    在我们的游戏中,经常需要将策划的数值配置成csv文件,所以解析csv文件就是一个很common的logic, 例如如下csv文件: 下面是一个基于cocos2dx 2.2.4的实现类: #ifndef ...

  9. iOS自定义控件创建原理(持续更新)

    前言 因为如果要创建各种自定义控件根据需求的不同会有很多的差别,所以我就在这里,分析一些自定义控件的创建实现方法 弹出视图 1.把要弹出的视图装在一个控制器里面,自定义转场动画 2.创建一个弹出视图, ...

  10. 【bzoj4066】简单题 KD-tree

    题目描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格子x,y里的数 ...