SmartBinding with kbmMW #4
前言
在前面写过的文章中,详细介绍过如何绑定各种不同类型的控件和数据源。在这篇文章中,将重点讨论如何支持绑定到TImage和TListView。(同时支持VCL与Firemonkey中的TImage及TListView)。
将图形绑定到TImage和绑定捕获
在VCL和FMX模式下,使用kbmMW都可以很容易地将数据集绑定到TImage。让我们举一个简单的例子:
在Prepare dataset按钮的Click事件代码:
procedure TForm1.Button8Click(Sender: TObject); var mt:TkbmMemTable; csv:TkbmCSVStreamFormat; begin bnd:=nil; Binding.Clear; if dataset<>nil then FreeAndNil(dataset); csv:=TkbmCSVStreamFormat.Create(nil); try mt:=TkbmMemTable.Create(nil); mt.LoadFromFileViaFormat('biolife.csv',csv); finally csv.Free; end; dataset:=mt; bnd:=Binding.Bind(dataset,'Category',Edit5,'Text',[mwboTwoWay]); Binding.Bind(dataset,'Species Name',Edit6,'Text',[mwboTwoWay]); Binding.Bind(dataset,'Graphic',Image1,'Picture'); if bnd.Navigator<>nil then bnd.Navigator.First; end;
上面的代码,建一个内存表,并从文件中加载内容,其中,有一个是图型字段Graphic。然后,将这些字段与Edit进行绑定,将Graphic与Image1.Picture属性绑定。运行他会得下以下结果:
当按下Prepare dataset按钮,就会显示数据集当前记录的内容了!
如果换成Firemonkey,除了绑定到TImage.Bitmap属性外,其他都一样。
如果我们想更新TImage并且自动同步到TDataSet对应的字段中,该怎么办呢?
首先,我们用双向绑定:
Binding.Bind(dataset,'Graphic',Image1,'Picture',[mwboTwoWay]);
然后,用下面的代码修改TImage中的图片,并更新到TDataSet中。
procedure TForm1.btnLoadBitmapClick(Sender: TObject); begin Image1.Picture.LoadFromFile('.\samplebitmap.png'); Binding.Changed(Image1,'Picture'); end;
第一行代码容易理解,将一个Png图片加载到TImage中。第二行则需要说明一下。
通常情况下,SmartBinding会自动找出控件的内容是否发生了变化,在这里对TImage实例进行操作时也可以这样做,但这样做,因为比较TImage当前位图与以前的位图,效率太慢了,所以取而代之,用Binding.Changed发出通知。
在这里,我们通知SmartBinding关于实例Image1的属性Picture的内容已更改。因此,所有订阅该属性的绑定都需要更新并且将被更新,其结果就是将图片保存到数据集中对应的字段中。
智能绑定一个TListView
TListView在VCL版本中与Firemonkey版本中的操作稍有不同,Firemonkey版本在显示内容和显示方式上更加灵活。
但是,绑定到它们非常相似。列表视图与大多数其他视觉控件的不同之处在于,它们显示子项(列表项),每个子项都有自己的一组属性,这些属性会影响它们表示的数据。
kbmMW SmartBind通过进一步扩展绑定到网格时先前显示的#语法,使绑定到这些属性变得容易。
让我们更改上面的示例,以现在使用VCL绑定到列表视图。
首先,我们添加一个标准的TListView并将其绑定到列表项标题,并照常绑定到其位置,因此我们可以使用列表视图进行导航。
bnd:=Binding.Bind(dataset,'Category',ListView2,'#caption'); Binding.Bind(dataset,'@',ListView2,'@',[mwboTwoWay]);
使用默认的ViewStyle(vsIcon),应用程序在运行时将如下所示。
单击列表视图中的任意位置,将自动在数据集中定位,从而自动显示在编辑框中。
注意特殊的#caption语法吗?它是可以使用的许多绑定成员名称之一。下表显示了当前支持的功能。
此外,在将VCL TListView置于ViewStyle vsReport模式时,可以通过使用绑定成员#0 ..#999来引用列号。
以下显示。将TListView的ViewStyle属性设置为vsReport并设置其列:
现在绑定到列号0和1。
Binding.Bind(dataset,'Species Name',ListView2,'#0'); Binding.Bind(dataset,'Common_Name',ListView2,'#1');
Firemonkey的TListView没有报表视图样式,但是可以通过将TListView的ItemAppearence设置为DynamicAppearence来添加任意数量的项目,并在设计器中右键单击列表视图实例,然后选择“切换设计”模式。在下一个示例中,我添加了两个文本项和一个图像项。请注意,每个项目的名称都是由TListView给出的,不能更改。因此,在示例中,我们找到了列表视图项Text1,Image2和Text3。
我们可以很容易地绑定到这些项目:
bnd:=Binding.Bind(dataset,'Common_Name',ListView2,'#Text1'); Binding.Bind(dataset,'Graphic',ListView2,'#Image2'); Binding.Bind(dataset,'Species Name',ListView2,'#Text3');
运行结果下如图: