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. Android环境安装简单总结

    1.安装JDK 参考 http://jingyan.baidu.com/article/215817f7e3f2bd1eda1423f4.html 2.安装android SDK 参考 http:// ...

  2. Python基础-week08 并发编程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  3. linux VIM编辑器常用指令

    一般模式 查看文本-移动光标 [Ctrl] + [f] 屏幕『向前』移动一页 [Ctrl] + [b]  屏幕『向后』移动一页  n<space> 按下数字后再按空格键,光标会向右移动这一 ...

  4. quagga源码学习--BGP协议对等体连接建立的状态机

    创建完bgp peer之后,就要bgp start了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了. 那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息. 下面列 ...

  5. Pointcut is not well-formed: expecting 'name pattern' at character position 53

    报错内容: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataso ...

  6. wewe

    <#assign base=rc.contextPath /> <#import "spring.ftl" as s /> <!DOCTYPE htm ...

  7. Codeforces Round #330 (Div. 2) B 容斥原理

    B. Pasha and Phone time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. vue-cli打包之后页面为空的问题。

    做了一个demo,想看一下打包之后的样子,发现页面是空的. 发现问题就要解决: 1.首先看控制台没有报任何错误,那就证明我们的代码是没有任何问题的. 只能是路径问题造成的. 2.在路由router/i ...

  9. 关于UITextView的限制字数显示,以及emjor表情占用字节处理,复制粘贴字节处理~优化

    //限制字数 #define MAX_LIMIT_NUMS 30 1 #pragma mark -- textview的代理事件 - (BOOL)textView:(UITextView *)text ...

  10. iterator & iterable

    一. java.lang.Iterable java.util.Iterator Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调用iter ...