首页 > 其他 > 详细

SmartBinding问题修正

时间:2019-11-15 15:34:58      阅读:85      评论:0      收藏:0      [点我收藏+]

千呼万唤始出来,最新的kbmMW 5.10.01终于发布了,详情可以看xalion发的更新日志

我期待的Smartbinding for Listview终于来了,在这一版本中,对SmartBind做了大量的功能扩展与更新,对Listview只是其中之一。这几天一直测试这个Listview的支持情况,发现一个致命的问题,看下面这行代码:

bnd:=Binding.Bind(dataset,f1,Edit1,Text,[mwboTwoWay]);

将dataset的f1字段绑定到Edit1的Text属性上,采用双向绑定的方式,目的是通过Edit1,能编辑字段的值,如同DBEdit的工作原理。

但实际的运行情况,与预期不符,当绑定后,SmartBind将Edit1.Text写到dataset的f1字段中,正好写反了!见下图:

技术分享图片

控件Edit1的属性Text值,正好写入dataset的f1字段中,然后ListView也显示了字段的值为Edit1。

通过读SmartBind的实现代码,找到解决方法,按下面代码修改,所有TkbmMWBinding.Create重载的版本都要改。

constructor TkbmMWBinding.Create(const ABindings:TkbmMWBindings;
                                 const ASource:TValue; const ASourceMember:string;
                                 const ADestination:TValue; const ADestinationMember:string;
                                 const AOptions:TkbmMWBindingOptions = []);
var
   v:TValue;
   b:boolean;
begin
     inherited Create;
     ....
     UpdateInfo;

     FDestinationProxy.SetValue(FSourceProxy.Value,true); //增加这一行.

end;

改后,我们再看看实际运行情况:

技术分享图片

上面两个Edit控件及下面的ListView控件终于都显示数据集的内容了!

原理分析:

SmartBind绑定,就是用TkbmMWBindings来管理TkbmMWBinding对象,即TkbmMWBindings增加一个绑定时,会建立一个TkbmMWBinding对象,并将这个对象加到TkbmMWBindings内部的列表中。问题就出在建立TkbmMWBinding对象过程中,没有将数据源的值赋值给目标源,然后,当SmartBind做数据同步时,错误的将目标源的值回写给了数据源,造成逻辑上的错误。我这里的修改,就是增加了这一步:将数据源的值赋值给目标源。

 

SmartBinding问题修正

原文:https://www.cnblogs.com/kinglandsoft/p/11865996.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!