千呼万唤始出来,最新的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做数据同步时,错误的将目标源的值回写给了数据源,造成逻辑上的错误。我这里的修改,就是增加了这一步:将数据源的值赋值给目标源。
原文:https://www.cnblogs.com/kinglandsoft/p/11865996.html