针对C++和Delphi的LiveBindings一瞥

绑定表达式(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

This entry was posted in Achitecture, Case. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s