0

我使用具有TPrototypeBindSource的業務類。我將使用CustomFormat連接2個字段。我使用TBindSourceDB,但不使用TPrototypBindSource。Delphi LiveBindings TPrototypeBindSource和customFormat

我使用了TEdit和TLinkControlToField。

如果我使用:%s +「text」=>它工作正常。 當我與一個TBindSourceDB,工作正常

%s + " - " + Self.Owner.FieldByName('Enseigne').text 

但我不知道如何訪問數據時,我TPrototypeBindSource工作中使用它。

enter image description here

enter image description here

你能不能給我連擊2場與業務類綁定語法?

+0

爲什麼不在業務對象中添加一個額外的字段,該字段會返回您試圖在控制端添加在一起的字段的串聯? – MartynA

+0

因爲業務對象的責任只是存儲數據(MVVM)。連接是我的觀點的一個約束。我想只使用customFormat ... – Joc02

回答

0

我以爲我會有另一個答案,因爲你對我的第一個問題似乎沒有太大的熱情。

在解決你的問題之前,讓我們嘗試一下實驗。在具有持久性字段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。

+0

是的,我明白了,你的例子工作正常。我只需要調用「BindExpression1.Evaluate」;在我的情況。對於您和創建新的應用程序,使用OO模型(MVVM)進行livebinding是一種好方法? – Joc02