接着上一回的话题,继续来研究数据批示特性,先拿简单的RageAttribute来弄弄,接着上次的示例,添加一个Age属性,并加上RangeAttribute。

  1. [Range(20,60,ErrorMessage="年龄范围在20与60之间。")]
  2. [Display(Name="年龄",Description="歌手年龄。")]
  3. public int Age { get; set; }

接着把XAML也补完整。

  1. <sdk:Label x:Name="lbAge" Target="{Binding ElementName=txtAge}" Grid.Column="0"
  2. Grid.Row="2" FontSize="14" Margin="1,1,20,1"/>
  3. <StackPanel Grid.Column="1" Grid.Row="2" Orientation="Horizontal">
  4. <TextBox x:Name="txtAge" Margin="1,1" Width="165"
  5. Text="{Binding Age}"/>
  6. <sdk:DescriptionViewer Target="{Binding ElementName=txtAge}"/>
  7. </StackPanel>
是不是可以了呢?
运行一下,定义的范围在20-60,现在输入100,然后把焦点文本框移走,结果发现,没有发生验证。
 
好,简单的不行,继续探索,把属性的定义改成这样:
  1. int m_Age = 20;
  2. [Range(20, 60, ErrorMessage = "年龄范围在20与60之间。")]
  3. [Display(Name = "年龄", Description = "歌手年龄。")]
  4. public int Age
  5. {
  6. get { return this.m_Age; }
  7. set
  8. {
  9. Validator.ValidateProperty(value,
  10. new ValidationContext(this, null, null) { MemberName = "Age" });
  11. this.m_Age = value;
  12. }
  13. }
然后再次运行,哟,上帝!还是不行,怎么了?Validator的验证方法也调用了,为什么还不行呢?
不要气馁,继续,还记得在XAML中写的绑定扩展标记不?想起来了吗?
1、默认是单向绑定Mode = Oneway;
2、没有显式设置启用验证。
嗯,这下明白了,再改改
 
  1. <TextBox x:Name="txtAge" Margin="1,1" Width="165"
  2. Text="{Binding Age,Mode=TwoWay,ValidatesOnExceptions=true, NotifyOnValidationError=true}"/>
再运行,这回验证了,但是,抛出了异常。那有没有办法不抛出异常而显示友好的错误提示呢?答案当然有,使用ValidationSummary 。
  1. <sdk:ValidationSummary Grid.Row="3" Grid.ColumnSpan="2"/>
再次按下F5,验证失败后仍然抛出异常,这时候,你可能有些失望。

山重水复疑无路,柳暗花明会成功,这时候,你在项目上右击,选择“在浏览器中查看”,啊,眼前一亮,出来了。

现在,总结一下方法:

1、在定义公共属性时加上对应的特性,如RangeAttribute;

2、在属性的set访问器上调用Validator的ValidateProperty方法;

3、在XAML或前台绑定时,将Binding 的Mode设置为TwoWay,ValidatesOnExceptions和NotifyOnValidationError设置为True;

4、添加ValidationSummary控件以显示错误列表,当然,不加也可以,看看下面的截图。

5、在非debug模式下运行程序。

最新文章

  1. C# 值类型和引用类型
  2. 从github下载某个git库的4种方法
  3. (转)js一道比较考验的题目
  4. OC加强-day01
  5. SaltStack Syndic配置
  6. swift中的传值
  7. matlab分割背景与物体
  8. SequoiaDB x Spark 新主流架构引领企业级应用
  9. bouncycastle 国密SM2 API的使用
  10. 第二章01:Hello world 案例
  11. What&#39;s the Difference Between Iterators and Generators in Python
  12. Java 一些知识点总结
  13. ios-密码判断
  14. 初探JavaScript的截屏实现
  15. Unity全面的面试题(包含答案)
  16. linux暂停一个在运行中的进程【转】
  17. day_5.26python面试重点
  18. 一、在windows环境下修改pip镜像源的方法(以python3为例)
  19. XLua访问C#中的List或者数组
  20. Mysql 多表查询详解

热门文章

  1. 并行运维工具pssh的安装及实战应用
  2. framework/base子目录
  3. What is an ISAPI Extension?
  4. padding valid same区别——就是是否补齐0的问题
  5. uploadify3.2.1版插件在ASP.NET中的使用
  6. 【HDU 4699】 Editor
  7. POJ 3264 Balanced Lineup 区间最值
  8. 第一周 Leetcode 57. Insert Interval (HARD)
  9. JavaGraphics类的绘图方法
  10. 如何使jquery性能最佳