65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.62/5 (7投票s)

2008 年 4 月 11 日

CPOL

4分钟阅读

viewsIcon

45211

downloadIcon

213

一个开源的 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);
    }
} 

现在,当 FirstNameLastName 发生更改时,全名标签会自动更新。

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 许可。

© . All rights reserved.