在现代应用程序开发中,数据绑定是一个重要的概念,它允许开发者将用户界面(UI)元素与数据模型进行连接。在本文中,将探讨如何使用ObjectDataSource来实现数据绑定,并通过一个名为PurchaseOrderForm的文档表单示例,展示如何将UI控件与数据对象进行绑定。
ObjectDataSource是一个强大的数据绑定组件,它允许将UI元素与对象的属性进行绑定。在文档表单PurchaseOrderForm中,将使用ObjectDataSource来绑定UI与底层的PurchaseOrder实例。任何对绑定对象的更改都会自动更新到UI中,用户所做的更改也会自动反映到底层的PurchaseOrder中。
要开始使用ObjectDataSource,首先需要定义它。Visual Studio提供了一个非常方便的数据源工具面板,通过这个面板可以轻松地添加数据源。如果还没有打开数据源工具面板,可以通过菜单栏的“视图”->“其他窗口”->“数据源”来打开它。
点击“添加数据源”按钮,会出现一个对话框。选择“对象”,然后点击“下一步”。接下来,展开项目名称,例如“MDICaseStudyPurchasing”,再展开“ObjectBase”,并勾选“PurchaseOrder”,然后点击“完成”。这样就会在数据源面板中添加一个由PurchaseOrder类定义的数据源。
现在,已经在数据源面板中有了PurchaseOrder的数据源。可以将面板中的属性拖放到表单上,以创建数据绑定控件。首先,需要从表单中删除RichTextBox,并移除与之相关的TextChanged事件处理程序,以及从PurchaseOrder构造函数中设置其文本的代码。
public PurchaseOrderForm(PurchaseOrder purchaseOrder)
{
// ...
InitializeComponent();
purchaseOrderBindingSource.DataSource = _purchaseOrder;
purchaseOrderBindingSource.ResetBindings(false);
}
接下来,将添加一个数据绑定控件来绑定PurchaseOrderNumber属性。在数据源面板中,属性旁边的图标会告诉拖动到表单上时会创建什么类型的控件。PurchaseOrderNumber已经默认为TextBox,这正是想要的,但可以通过点击属性旁边的下拉菜单来选择不同的控件类型。
默认的绑定类型是OnValidation,这意味着数据源只有在控件通过验证后才更新。由于TextBox在失去焦点之前不会通过验证,所以数据源不会更新,除非强制它更新。可以通过双击TextBox来创建一个事件处理程序,手动更新数据源,以确保用户输入的最新数据被更新到数据对象中。
private void purchaseOrderNumberTextBox_TextChanged(object sender, EventArgs e)
{
foreach (Binding b in purchaseOrderNumberTextBox.DataBindings)
{
b.WriteValue();
}
}
最后,需要将底层的PurchaseOrder实例设置为BindingSource的数据源。在PurchaseOrderForm的构造函数中,调用InitializeComponent()后,添加以下代码:
public PurchaseOrderForm()
{
// ...
InitializeComponent();
purchaseOrderBindingSource.DataSource = _purchaseOrder;
purcahseOrderBindingSource.ResetBindings(false);
}
public PurchaseOrderForm(PurchaseOrder purchaseOrder)
{
// ...
InitializeComponent();
purchaseOrderBindingSource.DataSource = _purchaseOrder;
purchaseOrderBindingSource.ResetBindings(false);
}
ResetBindings(false)将导致所有使用此绑定源的控件更新其显示的值,重新从底层对象源读取数据。指定false告诉BindingSource,数据模型的架构没有改变。
每当底层的PurchaseOrder发生变化时,希望BindingSource更新所有绑定的控件。因此,去到purchaseOrder_Changed事件处理程序,在用OnChanged(e)“冒泡”事件之前,添加一行代码来重置绑定。现在事件处理程序应该看起来像这样:
private void purchaseOrder_Changed(object sender, PurchaseOrderChangedEventArgs e)
{
purchaseOrderBindingSource.ResetBindings(false);
OnChanged(e);
}