WPF中数据绑定的Validation应用分析2011-12-17 博客园 南柯之石本来在写WPF Bug清单系列,但是写到第三篇(突然消失的ListViewItem)的时候发现重现BUG的逻辑 很复杂。而且需要比较多的基础知识,如果不先解释清楚,实在是怕有人用“不用Valiation不就行了” 等回复来砸场子。^_^本文从设计和应用的角度对DataBinding的Validation的不足进行了分析,假设读者使用过 DataBinding中的Validation。着重介绍WPF中DataBinding的Validation。有关数据绑定的基础知识请参 考MSDN。有的人很不欢喜用Data Binding,无论是WPF还是WinForm的。认为自己控制数据同步更新不就好了? 如果只是一个登录框或是写着玩的程序,也绝对没有什么问题。但是如果是在具有大量分层次的数据结构 的企业级程序中,手动地进行UI与后台数据的更新,不仅工作量繁重,而且容易出错。(WPF固然有很多 BUG,但是我们也不应该因此不用吧。)多数情况下,由ValiationRule继承来的简单Rule可以完成多数数据绑定的验证。比如 StringRequiredRule,LengthContraintRule,RegexValidationRule等等,在CodePlex上已经存在这样一 个简单Rule库的项目。(让人诧异的是这个没几行代码的东西还在Beta)但是对于稍稍复杂一点的Validation,一般的ValidationRule就无能为力了。比如下面的Person类。
public class Person { public int MaxAge = 1000; public int MinAge = 0; public int Age { get; set; } }
这时,要验证Age,就要取到MaxAge和MinAge的值。但是这个值在.NET Framework 3.0的 ValidationRule里是取不到的(3.5 SP1中可在BindingGroup的Validation中取到)。这还只是在兄弟属 性里找,如果Person有个Parent属性,我们要验证Parent是否存在,就要获取到所有的Person。这时我们就要祭出.NET Framework 3.5引入的DataErrorValidationRule或是.NET Framework 3.5 SP1 引入的BindingGroup。(未发布的.NET Framework 4.0其实才能算是WPF的完整版,其中加入了多个重要 组件。)PS:面对3.0、3.5的简陋,不想频繁跟进.NET的更新都不行。(或者说新版更诱人好听些)