BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

针对C++和Delphi的LiveBindings一瞥

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 臧秀涛 关注 2 他的粉丝 发布于 2013年1月24日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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

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

据Embarcadero介绍:

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

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

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

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

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

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

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

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

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT