绑定字段
创建和测试 CustomerPicker 窗体后,我创建了另一个名为 CustomerDetail 的窗体。这会显示选中的客户。我更改了数据源设置,以便在将 Customer 数据源拖到窗体时创建详细信息控件,然后自定义在“数据源”窗口显示的属性。随后我将控件拖到 CustomerDetail 窗体。图 5 显示了自定义之后的数据源。
Figure 5 Customized Data Source
现在我必须从 Web 服务的 GetCustomer Web 方法获取选中的 Customer 记录。我使用在前一窗体选中的 CustomerID,并调用 GetCustomer Web 方法。然后,返回的 Customer 实体会设为 CustomerDetail 窗体上 customerBindingSource 控件的数据源。现在我在仿真器中再次测试应用程序,即可看到图 6 所示的屏幕。
Figure 6 Application Running in the Emulator
移动绑定选项
通过在移动设备应用程序中使用 BindingSource 控件,实现自动绑定便轻而易举。这与 BindingSource 控件在 Windows Forms 应用程序中的工作原理类似,最显著的区别在于缺少 BindingNavigator 控件。由于移动应用程序没有 BindingNavigator 控件,因此,如果您需要从一个记录导航到下一个记录的功能,则必须编写代码。我倾向于避免此类功能,因为它通常是在检索大型项目列表时使用的。在移动应用程序中它会影响性能,因为移动设备通常具有有限的带宽。因此,缺少 BindingNavigator 并非是件坏事,因为它可以提醒您节约带宽。
BindingSource 解决了从实体手动获取值并将其填入窗体控件的难题。保存记录时,BindingSource 还消除了从窗体控件检索值并将其导回实体的麻烦。BindingSource 的缺点在于,手动加载数据时加载过程会有些慢。
如果测试中性能差异不是很大,我仍建议使用 BindingSource 控件。但是,我经常发现其性能已经足够。在需要将同一组数据绑定到多个控件时,您使用 BindingSource 控件所获得的自动绑定也非常有帮助。
更改为手动绑定十分简单。只需删除 BindingSource 控件,清除窗体上控件的数据源设置,并编写一些代码将每个值从实体加载到相应控件即可,如下所示:
using (RemoteService.CustomerWebService svc =
new RemoteService.CustomerWebService()) {
RemoteService.Customer customer = svc.GetCustomer(_customerID);
companyNameTextBox.Text = customer.CompanyName;
customerIDLabel1.Text = customer.CustomerID;
...
}
请注意,使用手动方法时,还必须考虑用户要保存数据时如何从控件提取数据。从控件捕获数据并将其导入实体的过程相当简单,但是要让用户保存信息则还需要处理两个额外的步骤。手动绑定常见做法是将 Customer 实体存储为 CustomerDetail 窗体的私有字段,这样在需要提取控件数据或将数据导回实体时可以轻松访问该实体。
微调移动应用程序
由于带宽可能有限,移动设备上的处理器比台式计算机慢,因此,只传递应用程序所需的最低数据量是至关重要的。在示例应用程序中,我检索了 Customer 实体列表,但只使用了每个实体中的两个属性。这浪费了 CustomerPicker 屏幕的大量带宽,因为它必须去获取所有客户的所有数据。
更有效的方法是创建仅检索每个客户 CustomerID 和 CompanyName 的方法。调整移动应用程序时必须牢记此类注意事项,因为诸如此类的性能问题可能不会出现在桌面应用程序中。
结论
在着手移动开发之前,进行正确的设置非常重要。您必须确保具备正确的仿真器管理器版本、适当的仿真器、正确的 SDK 以及所需的 ActiveSync 或 Windows Mobile 设备中心版本。当我在 Windows Vista 上运行应用程序时,只有安装 Windows Mobile 设备中心 6.1 和设备仿真器管理器 2 之后,仿真器才会与 Web 服务进行通信。这些是在 Windows Vista 中运行(甚至是面向 Windows Mobile 5.0)时必须安装的重要软件更新。
如果尝试使用 ActiveSync 查看仿真器时出错,请确保 ActiveSync 已设置为通过 DMA 进行通信。如果尝试访问 Web 服务时出错,则请确保 Web 服务使用您的服务器名称,而不是 localhost。Localhost 在您 PC 上会正常运行,但当仿真器尝试解释 localhost 时,它无法明白您指的是计算机的 Web 服务器。另一个有用提示是,确保您连接仿真设备并插入底座,以便它能够与本地 PC 进行通信。