当前位置: 首页 > news >正文

数据绑定(九)Binding的数据校验

原文: 数据绑定(九)Binding的数据校验

Binding用ValidationRules属性来校验数据的有效性,ValidationRules属性类型是Collection<ValidationRule>,他可以设置多个数据校验条件,ValidationRule是抽象类,使用的时候需要创建它的派生类并实现它的Validate方法,Validate方法的返回值是ValidationResult类型对象,如果校验通过,就把ValidationResult对象的IsValid属性设为true,反之,设为false,并为其ErrorContent属性设置一个合法的消息内容

界面代码

        <TextBox x:Name="textBox1" Margin="5"></TextBox>
        <Slider x:Name="slider1" Minimum="0" Maximum="100" Margin="5" />

TextBox用于设置滚动条的值,需要对TextBox中的值进行校验,首先需要准备一个校验类

    class RangeValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            double d = 0;
            if (double.TryParse(value.ToString(), out d))
            {
                if ((0 <= d) && (d <= 100))
                {
                    return new ValidationResult(true, null);
                }
            }

            return new ValidationResult(false, "输入值非法");
        }
    }

然后在后台代码中建立这样的Binding

            Binding binding = new Binding();
            binding.Source = slider1;
            binding.Path = new PropertyPath("Value");
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            RangeValidationRule rvr = new RangeValidationRule();
            binding.ValidationRules.Add(rvr);
            textBox1.SetBinding(TextBox.TextProperty, binding);

Binding进行校验时的默认行为是认为来自Source的数据始终是正确的,只有来自Target的数据才有可能有问题,为了不让有问题的数据污染Source所以需要校验,所以,Binding只有在Target被外部方法更新时校验数据,而来自Binding的Source数据更新Target时是不会进行校验的。如果想在Target改变Source数据时也进行校验,就需要将验证条件的ValidatesOnTargetUpdated属性设置为true。


修改前台代码为

    <StackPanel>
        <TextBox x:Name="textBox1" Margin="5"></TextBox>
        <Slider x:Name="slider1" Minimum="-10" Maximum="10" Margin="5" />
    </StackPanel>

绑定增加一行代码

            Binding binding = new Binding();
            binding.Source = slider1;
            binding.Path = new PropertyPath("Value");
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            RangeValidationRule rvr = new RangeValidationRule();
            rvr.ValidatesOnTargetUpdated = true;
            binding.ValidationRules.Add(rvr);
            textBox1.SetBinding(TextBox.TextProperty, binding);

当滑块拖动到负值时,TextBox显示校验失败


校验失败时,ValidationResult对象携带了一条错误消息,想要显示这条消息,首先在创建Binding时要把Binding对象的NotifyOnValidationError属性设置为true

相关文章:

  • 【转】oc中消息传递机制-附:对performSelector方法的扩充
  • 【WPF】SnapsToDevicePixels与UseLayoutRounding二者到底有什么区别?供参考
  • 每日一Lua(3)-函数
  • Python 学习日记7
  • js实现深拷贝
  • [转载]我再也不想在任何头文件中看到“using namespace xxx;”了
  • Mybatis架构设计及源码分析-SqlSession
  • C# 禁止windows程序重复运行的两种基本方法
  • 代码动态设置edittext输入类型为密码类型
  • 用ASDF来组织Lisp程序编译和加载
  • TensorFlow与OpenCV,读取图片,进行简单操作并显示
  • 移动终端开发必备知识
  • MAC配置环境变量
  • oracle的nvl和sql server的isnull
  • UTC时间与当地时间的转换关系?
  • C++类的相互关联
  • CSS居中完全指南——构建CSS居中决策树
  • Gradle 5.0 正式版发布
  • JavaScript DOM 10 - 滚动
  • javascript面向对象之创建对象
  • js学习笔记
  • v-if和v-for连用出现的问题
  • Vue2 SSR 的优化之旅
  • vuex 学习笔记 01
  • 技术胖1-4季视频复习— (看视频笔记)
  • 看域名解析域名安全对SEO的影响
  • 理清楚Vue的结构
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 自定义函数
  • 《天龙八部3D》Unity技术方案揭秘
  • 数据库巡检项
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​力扣解法汇总946-验证栈序列
  • #QT(TCP网络编程-服务端)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • ${ }的特别功能
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (31)对象的克隆
  • (4)Elastix图像配准:3D图像
  • (C语言)共用体union的用法举例
  • (day6) 319. 灯泡开关
  • (待修改)PyG安装步骤
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net中ListT 泛型转成DataTable、DataSet
  • /bin/bash^M: bad interpreter: No such file or directory
  • ::before和::after 常见的用法
  • @Pointcut 使用