代码改变世界

WPF中Binding的“事务”处理

2010-06-20 23:36  Franz  阅读(716)  评论(2编辑  收藏  举报

在我的上一篇《WPF 中的数据验证》中,我编写了数据的绑定验证的基类实现,很巧的事情时,在刚发布的MSDN Magazine  June 2010 Issue 中有一篇《Enforcing Complex Business Data Rules with WPF》文章详细的介绍了WPF的数据验证。

 

不过很遗憾的是,上面的文章没有提及如何在Binding中使用“事务” 。

我们其实有很多这样的情况,我们一个界面有很多的输入源。比如下图中所示:

 

 如果我们在更新一个用户的资料,当我们输入用户的姓名符合姓名的验证规则时,内存中的Persion对象的Name属性已经被同步的更新了,不管你的年龄是否验证正确,如果你在UI上取消了这个更新窗口(比如关闭当前的编辑面板)但是这个对象的Name属性还是被真实的改变了。

 

下边我们就用这个方法来解决这个问题,要达到的效果是,如果姓名和年龄有一个不相符就不能更新他们中的任何一个。

如下图所示:

 

 我们用BindingGroup把其中的所需要同时验证的对象属性组合到一起,如果全部验证Ok才让UI上确定按钮可用。

 

 具体办法如下:

 Binding的UpdateSourceTrigger要用手动模式(Explicit),如果UI上的TextBox发生变化,就直接通过BindingGroup的ValidateWithoutUpdate方法检查即可。如果检查通过启用UI上的保持按钮,在通过遍历BindingGroup中的BindingExpressions属性内的每一个BindingExpression,然后使用其UpdateSource方法提交。

 从效果上看这样达到了一个多个数据同时验证并提交的目的,即类似于使用“事务”进行了一个处理。