【问题标题】:Delphi LiveBindings TPrototypeBindSource and customFormatDelphi LiveBindings TPrototypeBindSource 和 customFormat
【发布时间】:2017-07-04 06:06:24
【问题描述】:

我使用带有 TPrototypeBindSource 的业务类。我将使用 CustomFormat 连接 2 个字段。我来的是 TBindSourceDB,但不是 TPrototypBindSource。

我使用 TEdit 和 TLinkControlToField。

如果我使用 : %s + " text" => 就可以了。 当我将它与 TBindSourceDB 一起使用时,效果很好

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

但是当我使用 TPrototypeBindSource 时,我不明白如何访问数据。

你能给我连接 2 个字段与业务类绑定的语法吗?

【问题讨论】:

  • 为什么不在业务对象中添加一个额外的字段来返回您试图在控制端添加在一起的字段的串联?
  • 因为业务对象的职责只是存储数据(MVVM)。串联是我观点的一个约束。我只想使用 customFormat...

标签: delphi delphi-10.1-berlin livebindings custom-formatting


【解决方案1】:

我想我会再试一次,因为你似乎对我的第一个答案没有太大的热情。

在解决您的问题之前,让我们做一个小实验。在具有 DataSet 的项目中 例如,使用持久字段 FieldA 和 FieldB 设置 BindSourceDB 和 BindingList 并添加 两个 TLinkControlToField 将这些字段链接到两个 TEdit,edFieldA 和 edFieldB。

测试它是否按预期工作,然后添加另一个 TEdit、edOther 和另一个 TLinkControlToField、LinkControlToField3。将其控件设置为 edOther,将 DataSource 设置为 BindSourceDB,将其 FieldName 设置为 FieldA。将其 CustomFormat 设置为

Name

编译运行,你会发现edOther显示了FieldA的Field组件名称,DataSetFieldA或类似名称。显然,发生了什么是 LiveBinding 的 表达式求值器使用 FieldA 的 TField 组件作为它使用的“范围” 确定引用了哪个 Name 属性。

现在,将 Name 替换为 Owner.Name

并且在运行时 edOther 应该显示 Form1 或类似的,因为持久性字段由其包含的表单或数据模块拥有。因此,引用 Owner.Name 扩大了可以解析 Format 表达式中的标识符并提取其值的范围。

因此,使用 BindSourceDB 作为链接的数据源,您可以将 CustomFormat 设置为相当复杂的值,例如

LowerCase(Owner.DataSet.IndexFieldNames) + ' ' + Owner.DataSet.FieldByName('ID').Text

很遗憾,这不适用于PrototypeBindSource 的默认设置。

继续我们的实验,使用带有两个字段的 PrototypeBindSource 设置项目 FieldA 和 FieldB 以及三个 TEdits,和以前一样。请注意,这一次,如果您尝试将 LinkControlToField3 的 CustomFormat 设置为 Name,您将收到错误消息“找不到名称”,我认为是因为 LB 机器无法解析对名称的引用,因为TPropotypeBindSource 中字段的抽象实现。

但是,一切都没有丢失。移除 LinkControlToField3,而是向表单的 BindingList 添加一个 BindExpression。

将 BindExpression 的 ControlComponent 设置为 edOther,将其 ControlExpression 设置为 Text,并将其 SourceComponent 设置为 Form1

完成后,在 SourceExpression 中,我们可以使用像这样的表达式来引用 Form1 及其组件的属性

edFieldA.Text + ':' + edFieldB.Text

这对我来说很好。

我还没有设法找出的一件事是 SourceExpression 不能包含像 LowerCase 这样的东西。然而,这很容易解决,通过向 Form1 添加一个MyLowerCase 函数,LB 对此非常满意。

所以,我认为这回答了您关于如何将内容连接到两个控件(或字段)的问题。就个人而言,我仍然更喜欢使用业务对象的串联属性,但是 ymmv。

【讨论】:

  • 是的,我明白了,您的示例运行良好。我只需要调用“BindExpression1.Evaluate;”就我而言。对于您和创建新应用程序来说,使用 OO 模型 (MVVM) 进行实时绑定是一个好方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2022-11-20
  • 2017-07-26
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多