Windows Forms 数据绑定的简单替代方案






3.62/5 (7投票s)
一个开源的 Windows Forms 控件库,可以自动更新。
引言
虽然数据绑定是 Windows Forms 控件中用于渲染数据库和对象数据的强大而便捷的方法,但它可能变得很复杂。Update Controls 库采用了一种更简单的方法。这些控件不将控件数据绑定到属性,而是通过触发事件来获取其数据。事件可以调用所需的任何业务逻辑。控件会跟踪该业务逻辑访问过的数据,当这些数据中的任何一个发生变化时,控件会再次触发事件来更新自身。
GetText 事件
UpdateTextBox 控件是一个简单的示例。它触发一个名为 GetText 的事件,该事件返回一个字符串。您通过返回文本框应显示的字符串来处理此事件。
private string firstNameTextBox_GetText() { return _person.FirstName; }
每当 person 的 FirstName 属性发生更改时,控件都会再次触发该事件以获取新文本。
但是控件不必直接绑定到数据。它们可以调用业务逻辑。例如,一个显示 person 全名的标签将具有此 GetText 事件。
private string fullNameLabel_GetText() { return _person.FullName; }
其中 Person 对象定义了如下的 FullName。
public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } }
现在,当 FirstName 或 LastName 发生更改时,全名标签会自动更新。
SetText 事件
当用户编辑 UpdateTextBox 中的文本时,它会触发一个名为 SetText 的事件。正如您所能想象的,这个事件会接收用户刚刚输入的字符串。
private void firstNameTextBox_SetText(string value) { _person.FirstName = value; }
由于此事件更改了 FirstName 属性,因此会导致全名标签自动更新。
但是等等!我并没有告诉它第一个名字文本框和全名标签是相关的。那里没有任何代码可以强制在第一个名字更改时更新全名。您不需要那些代码,因为 Update Controls 库可以自行找出这种关系。
动态哨兵 (Dynamic sentry)
使这一切发生的“魔法”是 Dynamic 哨兵。该对象位于您的每个数据字段旁边,并监视对该数据的任何访问。Person 对象有两个:一个用于名字,一个用于姓氏。
private string _firstName; private string _lastName; #region Dynamic properties // Generated by Update Controls -------------------------------- private Dynamic _dynFirstName = new Dynamic(); private Dynamic _dynLastName = new Dynamic(); public string FirstName { get { _dynFirstName.OnGet(); return _firstName; } set { _dynFirstName.OnSet(); _firstName = value; } } public string LastName { get { _dynLastName.OnGet(); return _lastName; } set { _dynLastName.OnSet(); _lastName = value; } } // End generated code -------------------------------- #endregion
每次获取数据字段的值时,您都会调用其哨兵的 OnGet。每次更改它时,您都会调用 OnSet。但不用担心自己编写所有这些哨兵代码。Update Controls 库包含一个 Visual Studio 插件,可以生成 C# 或 VB 代码来处理数据字段。只需选择您想公开的字段,然后按 Ctrl+D, G。
在 Update Controls 触发 Get 事件(如 GetText)之前,它会将一个监视器推送到堆栈。当您调用 Dynamic.OnGet 时,它会查看堆栈以找到该监视器。此时,它知道该控件依赖于该数据。事件结束后,它会从堆栈中弹出监视器,并记住访问过的 Dynamic 哨兵集合。
然后,当您调用 Dynamic.OnSet 时,它会查找访问过该哨兵的所有控件。它现在知道所有这些控件都已过时。当您完成所有更改后,这些控件中的每一个都会触发其 Get 事件来自我更新。
其他控件类型
Update Controls 库封装了所有常见的 Windows Forms 控件。每种控件类型都有一个或多个 Get 事件,用于返回它们显示的数据类型。例如,UpdateCheckBox 触发 GetChecked 事件,返回一个布尔值。
有些控件显示多个数据项。这些控件会触发多个 Get 事件来获取它们显示的各种数据。例如,UpdateListBox 首先触发 GetItems 来获取对象列表,然后对每个项触发 GetItemText 来获取要显示的文本。
大多数控件还会触发 GetEnabled 事件。此事件在控件应启用时返回 true,在控件应禁用时返回 false。如果未处理该事件,则控件始终处于启用状态。这使得可以轻松地响应其他控件的变化来启用和禁用控件。
试用
从 http://codeplex.com/updatecontrols 下载源代码或二进制安装程序。然后打开本文附加的 Visual Studio 项目。我已开始对库进行一些类级别的文档记录,网址为 http://updatecontrols.net/cs/documentation.shtml。如果您有任何问题,请发送电子邮件至 support@updatecontrols.net。
Update Controls 库根据 LGPL 许可。QuickDemo 示例应用程序根据 Code Project Open License 许可。