将 WPF 控件绑定到 WCF 数据服务

在本演练中,你将创建一个包含数据绑定控件的 WPF 应用程序。 这些控件绑定到封装在 WCF 数据服务中的客户记录。 你还将添加客户可用于查看和更新记录的按钮。

本演练演示了以下任务:

  • 创建从 AdventureWorksLT 示例数据库中的数据生成的实体数据模型。

  • 创建 WCF 数据服务,用于向 WPF 应用程序公开实体数据模型中的数据。

  • 通过将项从 “数据源 ”窗口拖动到 WPF 设计器来创建一组数据绑定控件。

  • 创建在客户记录中向前和向后导航的按钮。

  • 创建一个按钮,用于将控件中的数据更改保存到 WCF 数据服务和基础数据源。

注释

本文中的说明阐述了 Visual Studio 中可用的最新版本的交互式开发体验 (IDE)。 你的计算机可能会对某些用户界面元素显示不同的名称或位置。 你可能正在使用其他版本的 Visual Studio 或其他环境设置。 有关详细信息,请参阅个性化设置 IDE

先决条件

需要以下组件才能完成本演练:

  • Visual Studio

  • 访问 SQL Server 或 SQL Server Express 正在运行的实例,该实例附加了 AdventureWorksLT 示例数据库。 若要下载数据库,请参阅 AdventureWorks 示例数据库

事先了解以下概念也很有用,但对于完成本演练并不是必需的:

创建服务项目

  1. 通过创建 C# 或 Visual Basic ASP.NET Web 应用程序 项目来启动本演练。 将项目命名 为 AdventureWorksService

  2. 解决方案资源管理器中,右键单击 Default.aspx 并选择“ 删除”。 本演练不需要此文件。

为服务创建实体数据模型

若要使用 WCF 数据服务向应用程序公开数据,必须为服务定义数据模型。 WCF 数据服务支持两种类型的数据模型:实体数据模型,以及使用实现 IQueryable<T> 接口的公共语言运行时 (CLR) 对象定义的自定义数据模型。 在本演练中,你将为数据模型创建实体数据模型。

  1. 在“项目”菜单上,单击 “添加新项”

  2. 在“已安装的模板”列表中,单击“ 数据”,然后选择 ADO.NET 实体数据模型 项目项。

  3. 将名称 AdventureWorksModel.edmx更改为,然后单击“ 添加”。

    此时会打开 “实体数据模型 ”向导。

  4. 在“ 选择模型内容 ”页上,单击“ 从数据库生成”,然后单击“ 下一步”。

  5. 在“ 选择数据连接 ”页上,选择以下选项之一:

    • 如果下拉列表中提供了与 AdventureWorksLT 示例数据库的数据连接,请选择它。

    • 单击 “新建连接”,并创建与 AdventureWorksLT 数据库的连接。

  6. “选择数据连接 ”页上,确保已选中 App.Config 中的“保存实体连接设置” 选项,然后选择“ 下一步”。

  7. 在“ 选择数据库对象 ”页上,展开 “表”,然后选择 SalesOrderHeader 表。

  8. 单击“完成”。

创建服务

创建 WCF 数据服务以向 WPF 应用程序公开实体数据模型中的数据:

  1. “项目 ”菜单上,选择“ 添加新项”。

  2. “已安装的模板 ”列表中,单击“ Web”,然后选择 WCF 数据服务 项目项。

  3. “名称 ”框中,键入 AdventureWorksService.svc并单击“ 添加”。

    Visual Studio 将 AdventureWorksService.svc 添加到项目。

配置服务

您必须将服务配置为在您创建的实体数据模型上进行操作。

  1. AdventureWorks.svc 代码文件中,将 AdventureWorksService 类声明替换为以下代码。

    public class AdventureWorksService : DataService<AdventureWorksLTEntities>
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("SalesOrderHeaders", EntitySetRights.All);
        }
    }
    

    此代码更新 AdventureWorksService 类,使其继承自一个在您的实体数据模型中的 AdventureWorksLTEntities 对象上下文类上运行的DataService<T>类。 它还会更新方法 InitializeService,以允许服务客户端对SalesOrderHeader 实体进行完全读/写访问。

  2. 生成项目,并验证它是否生成时没有错误。

创建 WPF 客户端应用程序

若要显示 WCF 数据服务中的数据,请使用基于服务的数据源创建新的 WPF 应用程序。 在本演练的后面部分,你将向应用程序添加数据绑定控件。

  1. 解决方案资源管理器中,右键单击解决方案节点,单击“ 添加”,然后选择“ 新建项目”。

  2. 在“ 新建项目 ”对话框中,展开 Visual C#Visual Basic,然后选择 “Windows”。

  3. 选择 WPF 应用程序 项目模板。

  4. “名称 ”框中,键入 AdventureWorksSalesEditor并单击“ 确定”。

    Visual Studio 将 AdventureWorksSalesEditor 项目添加到解决方案。

  5. “数据 ”菜单上,单击“ 显示数据源”。

    此时会打开 “数据源 ”窗口。

  6. “数据源 ”窗口中,单击“ 添加新数据源”。

    此时会打开 “数据源配置 ”向导。

  7. 在向导的“ 选择数据源类型 ”页中,选择 “服务”,然后选择“ 下一步”。

  8. “添加服务引用 ”对话框中,单击“ 发现”。

    Visual Studio 在当前解决方案中搜索可用服务,并在“服务”框中添加到AdventureWorksService.svc可用服务列表中。

  9. 命名空间 框中,键入 AdventureWorksService

  10. “服务 ”框中,单击 AdventureWorksService.svc,然后选择“ 确定”。

    Visual Studio 下载服务信息,然后返回到 数据源配置 向导。

  11. “添加服务引用 ”页中,单击“ 完成”。

    Visual Studio 将表示服务返回的数据的节点添加到 “数据源 ”窗口。

定义用户界面

通过修改 WPF 设计器中的 XAML,向窗口添加多个按钮。 在本演练的后面部分,你将添加代码,使用户能够使用这些按钮查看和更新销售记录。

  1. 解决方案资源管理器中,双击 MainWindow.xaml

    窗口将在 WPF 设计器中打开。

  2. 在设计器的 XAML 视图中,在标记之间 <Grid> 添加以下代码:

    <Grid.RowDefinitions>
        <RowDefinition Height="75" />
        <RowDefinition Height="525" />
    </Grid.RowDefinitions>
    <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75"><</Button>
    <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">></Button>
    <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
    
  3. 构建项目。

创建数据绑定控件

通过将SalesOrderHeaders节点从“数据源”窗口拖动到设计器,来创建用于显示客户记录的控件。

  1. “数据源 ”窗口中,单击 SalesOrderHeaders 节点的下拉列表菜单,然后选择“ 详细信息”。

  2. 展开“SalesOrderHeaders”节点

  3. 对于此示例,不会显示某些字段,因此请单击以下节点旁边的下拉列表菜单,然后选择 “无” :

    • CreditCardApprovalCode

    • ModifiedDate

    • OnlineOrderFlag

    • RevisionNumber

    • rowguid

    此作可防止 Visual Studio 在下一步中为这些节点创建数据绑定控件。 对于本演练,假定最终用户不需要查看此数据。

  4. “数据源 ”窗口中,将 SalesOrderHeaders 节点拖到包含按钮的行下的网格行。

    Visual Studio 生成 XAML 和代码,用于创建一组绑定到 Product 表中数据的控件。 有关生成的 XAML 和代码的详细信息,请参阅将 WPF 控件绑定到 Visual Studio 中的数据

  5. 在设计器中,单击 “客户 ID ”标签旁边的文本框。

  6. “属性” 窗口中,选中 IsReadOnly 属性旁边的复选框。

  7. 为以下每个文本框设置 IsReadOnly 属性:

    • 采购订单编号

    • 销售订单 ID

    • 销售订单编号

从服务加载数据

使用服务代理对象从服务加载销售数据。 然后将返回的数据分配给 WPF 窗口中的 CollectionViewSource 数据源。

  1. 在设计器中,若要创建 Window_Loaded 事件处理程序,请双击读取的文本: MainWindow

  2. 将事件处理程序替换为以下代码。 请确保将此代码中的地址替换为 localhost 开发计算机上的本地主机地址。

    private AdventureWorksService.AdventureWorksLTEntities dataServiceClient;
    private System.Data.Services.Client.DataServiceQuery<AdventureWorksService.SalesOrderHeader> salesQuery;
    private CollectionViewSource ordersViewSource;
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // TODO: Modify the port number in the following URI as required.
        dataServiceClient = new AdventureWorksService.AdventureWorksLTEntities(
            new Uri("http://localhost:45899/AdventureWorksService.svc"));
        salesQuery = dataServiceClient.SalesOrderHeaders;
    
        ordersViewSource = ((CollectionViewSource)(this.FindResource("salesOrderHeadersViewSource")));
        ordersViewSource.Source = salesQuery.Execute();
        ordersViewSource.View.MoveCurrentToFirst();
    }
    

添加代码,使用户能够使用 <> 按钮滚动浏览销售记录。

  1. 在设计器中,双击 < 窗口图面上的按钮。

    Visual Studio 将打开代码隐藏文件,并为该Click事件创建新的backButton_Click事件处理程序。

  2. 将以下代码添加到生成的 backButton_Click 事件处理程序:

    if (ordersViewSource.View.CurrentPosition > 0)
        ordersViewSource.View.MoveCurrentToPrevious();
    
  3. 返回到设计器,然后双击按钮 >

    Visual Studio 将打开代码隐藏文件,并为该Click事件创建新的nextButton_Click事件处理程序。

  4. 将以下代码添加到生成的 nextButton_Click 事件处理程序:

    if (ordersViewSource.View.CurrentPosition < ((CollectionView)ordersViewSource.View).Count - 1)
    {
        ordersViewSource.View.MoveCurrentToNext();
    }
    

保存对销售记录的更改

添加代码,让用户使用“ 保存更改 ”按钮查看和保存对销售记录的更改:

  1. 在设计器中,双击“ 保存更改 ”按钮。

    Visual Studio 将打开代码隐藏文件,并为该Click事件创建新的saveButton_Click事件处理程序。

  2. 将以下代码添加到 saveButton_Click 事件处理程序。

    AdventureWorksService.SalesOrderHeader currentOrder = (AdventureWorksService.SalesOrderHeader)ordersViewSource.View.CurrentItem;
    dataServiceClient.UpdateObject(currentOrder);
    dataServiceClient.SaveChanges();
    

测试应用程序

生成并运行应用程序,验证是否可以查看和更新客户记录:

  1. “生成 ”菜单上,单击“ 生成解决方案”。 验证解决方案是否生成时没有错误。

  2. Ctrl+F5

    Visual Studio 在未调试的情况下启动 AdventureWorksService 项目。

  3. 解决方案资源管理器中,右键单击 AdventureWorksSalesEditor 项目。

  4. 在右键单击菜单(上下文菜单),在 “调试”下,单击“ 启动新实例”。

    应用程序运行。 检查下列各项:

    • 文本框显示来自第一个销售记录的不同数据字段,其中包含销售订单 ID 71774

    • 您可以单击><按钮来导航浏览其他销售记录。

  5. 在某个销售记录中,在 “批注 ”框中键入某些文本,然后选择“ 保存更改”。

  6. 关闭应用程序,然后再次从 Visual Studio 启动应用程序。

  7. 导航到已更改的销售记录,并验证更改在关闭并重新打开应用程序后是否仍然存在。

  8. 关闭应用程序。

后续步骤

完成本演练后,可以执行以下相关任务: