前言
在前面寫過的文章中,詳細介紹過如何將各種的控件與數據源進行綁定(Bind)。在這篇文章中,將重點討論如何綁定TImage和TListView。(同時支持VCL與Firemonkey)。
將圖形數據源綁定到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的Graphic字段中,該怎么辦呢?
首先,我們用雙向綁定:
Binding.Bind(dataset,'Graphic',Image1,'Picture',[mwboTwoWay]);
然后,用下面的代碼修改TImage中的圖片,並更新到Graphic字段中。
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的內容已更改,所有訂閱該屬性的數據源都需要更新,本例的結果就是將圖片保存到數據集的Graphic字段中。
( 2020.4.3:kbmMW 10.20中發現一個字段綁定一個TEdit,然后給TEdit賦值,再調用Binding.Changed無效,給TEdit的值沒有傳遞給字段。)
智能綁定一個TListView
TListView在VCL版本中與Firemonkey版本中的操作稍有不同,Firemonkey版本在顯示內容和顯示方式上更加靈活。
但是,綁定到它們非常相似。列表視圖與大多數其他視覺控件的不同之處在於,它們顯示子項(列表項),每個子項都有自己的一組屬性,這些屬性會影響它們表示的數據。
kbmMW SmartBinding通過進一步擴展綁定Grid時使用的#語法,使綁定這些屬性變得容易。
讓我們更改上面的例子,實現數據集綁定到ListView。
首先,我們添加一個標准的TListView,然后將數據集中的Category字段綁定到列表項的Caption屬性,再綁定數據集與ListView的位置,讓我們可以使用ListView時,同時導航TDataSet的位置。
bnd:=Binding.Bind(dataset,'Category',ListView2,'#caption'); Binding.Bind(dataset,'@',ListView2,'@',[mwboTwoWay]);
使用默認的ViewStyle(vsIcon),應用程序在運行時將如下所示。

單擊ListView中的任意位置,將自動同步數據集的當前記錄,Edit控件也會自動顯示所綁定字段的當前記錄的內容。
注意到特殊的#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沒有vsReport視圖樣式,但是可以通過將TListView的ItemAppearence設置為DynamicAppearence來添加任意數量的顯示控件,具體操作方法:在設計器中,在ListView上單擊右鍵,然后選擇“Toggle DesignMode”模式。如下圖,我添加了兩個Text和一個Image,可以看到ListView中的Text1,Image2和Text3。

下面的代碼,將字段綁定到填加的Item上:
bnd:=Binding.Bind(dataset,'Common_Name',ListView2,'#Text1'); Binding.Bind(dataset,'Graphic',ListView2,'#Image2'); Binding.Bind(dataset,'Species Name',ListView2,'#Text3');
運行結果如下圖:

原文地址: https://components4developers.blog/2019/10/18/smartbinding-with-kbmmw-4/
