针对C++和Delphi的LiveBindings一瞥

绑定表达式(Binding expression)并不是新概念,XAML和Flex开发者主要就依靠这个。但除C++/CX(只用于WinRT编程)之外,原生编程语言中通常见不到这种概念。不过为VCL和FireMonkey设计的LiveBindings却是个例外。

\u0026#xD;\n

我们先来介绍一些背景知识。VCL(Visual Component Library)是Delphi和C++ Builder都支持的老式UI框架。它支持x86和x64模式,但只能运行在Windows操作系统上。FireMonkey在新的应用程序中代替了VCL。它既支持Windows,也支持OS X。FileMonkey和VCL可用于同一应用程序中,不过不能用于同一模块中。

\u0026#xD;\n

据Embarcadero介绍:

\u0026#xD;\n
\u0026#xD;\n

LiveBindings基于称作绑定表达式的关系表达式,既可以是单向的,也可以是双向的。LiveBindings还包括控制对象和源对象。借助绑定表达式,任何对象都可以绑定到其他任何对象,只需要定义包含所要绑定对象的一个或多个属性的绑定表达式。例如,可以把一个Tedit控件绑定到一个Tlabel,这样当编辑框中的文本改变时,标签的标题也会根据绑定表达式计算而得的值自动调整。再举一个例子,把轨迹条控件绑定到进度条,拖动轨迹条时进度条也可以相应变化。

\u0026#xD;\n
\u0026#xD;\n

和很多Delphi/C++ Builder工具类似,LiveBindings通常使用GUI工具创建。这里有两种选择:LiveBindings DesignerLiveBindings Wizard。这无疑会让习惯于手工编辑XAML或Flex的绑定表达式的开发者不爽。

\u0026#xD;\n

请注意,以编程方式编辑绑定是可能的,但强烈建议不要这么做。这方面的文档深埋在一个关于控制台应用的教程中。

\u0026#xD;\n

与.NET中要求对象实现某些复杂的设计模式不同,Delphi和C++ Builder中的对象默认就是可绑定的。几乎和所有对象一样,只需要继承TObject,然后像正常情况一样暴露出属性。对C++ Builder而言,这意味着要使用__property扩展关键字。

\u0026#xD;\n

实际应用绑定表达式的代码非常繁琐,不过确实能支持复杂表达式。在下面的例子中,我们可以看到表达式“o1.IntegerValue + o2.IntegerValue”被绑定到了MyResultObject.IntegerValue属性。

\u0026#xD;\n

c685401877bbecc210d2840813157944.png\"

\u0026#xD;\n

在XAML技术中,绑定表达式是基于事件的。为避免内存泄漏,它们在内部使用了一个“弱事件(weak events)”结构来监控需要通过绑定表达式转发(relay) 的PropertyChanged事件。该结构要求所有绑定集中注册,不过事实上大多数开发者并没有意识到这一点。

\u0026#xD;\n

LiveBindings缺乏属性变更事件这一概念,因此要进行类似的抽象就不可能了。 虽然Bindings仍然是集中注册的,但属性变更时需要显式通知绑定引擎。这通过Tbindings.Notify函数完成,该函数接受对象和属性名。

\u0026#xD;\n

理论上,TBindings.Notify函数可由属性setter调用,而无需客户端代码显式调用。虽然文档没有介绍,但这又带来了多线程相关问题,不过确实消除了对弱事件的需求。

\u0026#xD;\n

参考英文原文A Look at LiveBindings for C++ and Delphi

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
11-23 791
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值