我以爲我會有另一個答案,因爲你對我的第一個問題似乎沒有太大的熱情。
在解決你的問題之前,讓我們嘗試一下實驗。在具有持久性字段FieldA和FieldB的數據集 的項目中,假設設置了BindSourceDB和BindingList,並添加兩個TLinkControlToFields將這些字段鏈接到兩個TEdits edFieldA和edFieldB。
測試它是否按預期工作,然後添加另一個TEdit,edOther和另一個TLinkControlToField,LinkControlToField3。將其控件設置爲edOther,將數據源設置爲BindSourceDB,將其FieldName設置爲FieldA。其CustomFormat設置爲
Name
編譯並運行,你會發現,edOther顯示FIELDA的字段組件,DataSetFieldA或類似的名稱。很明顯,LiveBinding的 表達式計算器正在使用FieldA的TField組件作爲它使用的「範圍」,以識別哪個Name
屬性被引用。
現在,Owner.Name
,並在運行時edOther更換Name
應該顯示Form1
或類似的,因爲持久字段由它們包含窗體或數據模塊擁有。因此,引用Owner.Name擴大了Format
表達式中標識符可以解析的範圍,並提取了它們的值。
因此,使用BindSourceDB作爲鏈接的數據源,您可以將CustomFormat
設置爲相當複雜的事情,例如,
LowerCase(Owner.DataSet.IndexFieldNames) + ' ' + Owner.DataSet.FieldByName('ID').Text
不幸的是,這不適用於默認設置PrototypeBindSource
。
繼續我們的實驗,使用PrototypeBindSource創建一個項目,其中包含兩個字段 FieldA和FieldB以及三個TEdits。請注意,這次如果您嘗試將LinkControlToField3的CustomFormat
設置爲Name
,則會收到錯誤消息'Could not find Name',我認爲是因爲LB機器無法解析對字段的引用,因爲抽象的字段實現在TPropotypeBindSource中。
但是,一切都不會丟失。刪除LinkControlToField3,而是添加到表單的BindingList一個BindExpression。
將BindExpression的ControlComponent設置爲edOther
,將其ControlExpression設置爲Text
,將其SourceComponent設置爲Form1
。
做完這些後,在SourceExpression,大家可以參考到Form1及其組件的性能,與表達這樣一個
edFieldA.Text + ':' + edFieldB.Text
這對我來說工作正常。
我還沒有設法找出的一件事是SourceExpression不能包含諸如LowerCase
之類的東西。然而,這很容易解決,通過向Form1添加MyLowerCase
函數,LB對此非常滿意。
所以,我認爲這回答如何將內容連接到兩個控件(或字段)的q。就個人而言,我仍然希望使用業務對象的連接屬性,但是ymmv。
爲什麼不在業務對象中添加一個額外的字段,該字段會返回您試圖在控制端添加在一起的字段的串聯? – MartynA
因爲業務對象的責任只是存儲數據(MVVM)。連接是我的觀點的一個約束。我想只使用customFormat ... – Joc02