原文:数据绑定(九)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

最新文章

  1. 记录下最近项目中常用到的SQL语句
  2. 关于Block的copy和循环引用的问题
  3. HackerRank &quot;Kitty and Katty&quot;
  4. 【 Jquery插件】引导用户如何操作网站功能的向导
  5. UVa 11426 - GCD - Extreme (II)
  6. 学习Python必须要知道的常用模块
  7. SQL Server Profiler参数说明
  8. wpf中,一个简单的自定义treeview
  9. C# IL 指令集
  10. thinkphp 官方文件执行引入流程
  11. c# 岛2 小辅助~~~ 钓鱼 连击
  12. Ajax模拟Form表单提交,含多种数据上传
  13. #035 大数阶乘 PTA题目6-10 阶乘计算升级版 (20 分)
  14. Qt中在UI文件中新建控件并命名,但在代码中无法识别UI中的控件?
  15. NMON使用以及nmon_analyse生成分析报表
  16. WebSocket ,Socket ,Http差异
  17. Linux之cd、pwd、mkdir、rmdir
  18. 保存数据到Excel中
  19. ---mingw Linux交叉编译给Window的工具
  20. PHP多条件模糊查询

热门文章

  1. Ajax基础与Json应用(一)
  2. 强大的 function adapters
  3. c头文件(.h)的作用
  4. Oracle数据库分页查询的几种实现方法
  5. JQuery:cookie插件
  6. 学习鸟哥的Linux私房菜笔记(10)——bash2
  7. 【a202】&&【9208】输油管道问题
  8. linux下jar包的生存与开机自动启动
  9. DEA上安装和使用checkstyle,findbugs,visualVM,PMD插件
  10. 智能手环体验:UP24