演练:将 WPF 控件绑定到 WCF 数据服务
发布日期: 2016年7月
在本演练中,你将创建一个包含数据绑定控件的 WPF 应用程序。 这些控件将绑定到在 WCF 数据服务 中封装的客户记录。 你还将添加客户可用于查看和更新记录的按钮。
本演练阐释了以下任务:
创建一个利用 AdventureWorksLT 示例数据库中的数据生成的实体数据模型。
创建一个向 WPF 应用程序公开实体数据模型中的数据的 WCF 数据服务。
通过将项从**“数据源”**窗口拖到 WPF 设计器来创建一组数据绑定控件。
创建用于向前/向后导航客户记录的按钮。
创建一个用于将控件中数据的更改保存到 WCF 数据服务 和基础数据源中的按钮。
备注
以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化 IDE。
系统必备
你需要以下组件来完成本演练:
Visual Studio
对附加了 AdventureWorksLT 示例数据库的 SQL Server 或 SQL Server Express 的正在运行的实例的访问权限。 你可以从 CodePlex 网站下载 AdventureWorksLT 数据库。
事先了解以下概念也很有用,但对于完成本演练并不是必需的:
WCF 数据服务。 有关详细信息,请参阅概述。
WCF 数据服务 中的数据模型。
实体数据模型和 ADO.NET Entity Framework。 有关详细信息,请参阅实体框架概述。
使用 WPF 设计器。 有关详细信息,请参阅WPF and Silverlight Designer 概述。
WPF 数据绑定。 有关详细信息,请参阅数据绑定概述。
创建服务项目
从为 WCF 数据服务 创建项目开始本演练。
创建服务项目
启动 Visual Studio。
在**“文件”菜单上,指向“新建”,然后单击“项目”**。
展开**“Visual C#”或“Visual Basic”,然后选择“Web”**。
选择**“ASP.NET Web 应用程序”**项目模板。
在**“名称”框中,键入
AdventureWorksService
,然后单击“确定”**。Visual Studio 将创建
AdventureWorksService
项目。在**“解决方案资源管理器”中,右键单击“Default.aspx”,然后选择“删除”**。 本演练中不需要此文件。
为服务创建实体数据模型
若要通过使用 WCF 数据服务 向应用程序公开数据,则必须为该服务定义一个数据模型。 WCF 数据服务 支持两种类型的数据模型:实体数据模型和自定义数据模型,这两种数据模型是通过使用实现 IQueryable<T> 接口的公共语言运行时 (CLR) 对象定义的。 在本演练中,你将为该数据模型创建一个实体数据模型。
创建实体数据模型
在**“项目”菜单上,单击“添加新项”**。
在“已安装的模板”列表中,单击**“数据”,然后选择“ADO.NET 实体数据模型”**项目项。
将名称更改为
AdventureWorksModel.edmx
,然后单击**“添加”**。将打开**“实体数据模型向导”**。
在**“选择模型内容”页面上,单击“从数据库生成”,然后单击“下一步”**。
在**“选择你的数据连接”**页面上,选择以下选项之一:
如果下拉列表中包含到 AdventureWorksLT 示例数据库的数据连接,请选择该连接。
- 或 -
单击**“新建连接”**,然后创建到 AdventureWorksLT 数据库的连接。
在**“选择你的数据连接”页面上,确保选中了“将 App.Config 中的实体连接设置另存为”选项,然后单击“下一步”**。
在**“选择数据库对象”页面上,展开“表”,然后选择“SalesOrderHeader”**表。
单击**“完成”**。
创建服务
创建 WCF 数据服务,以向 WPF 应用程序公开实体数据模型中的数据。
创建服务
在**“项目”菜单上选择“添加新项”**。
在“已安装的模板”列表中,单击**“Web”,然后选择“WCF 数据服务”**项目项。
在**“名称”框中,键入
AdventureWorksService.svc
,然后单击“添加”**。Visual Studio 将
AdventureWorksService.svc
添加到项目中。
配置服务
必须配置该服务,才能操作所创建的实体数据模型。
配置服务
在
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); } }
Public Class AdventureWorksService Inherits DataService(Of AdventureWorksLTEntities) ' This method is called only once to initialize service-wide policies. Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration) config.SetEntitySetAccessRule("SalesOrderHeaders", EntitySetRights.All) config.UseVerboseErrors = True End Sub End Class
此代码将更新
AdventureWorksService
类,以使其派生自操作实体数据模型中的AdventureWorksLTEntities
对象上下文类的 DataService<T>。 此代码还将更新InitializeService
方法,以使服务的客户端具有对SalesOrderHeader
实体的完全读/写访问权限。生成项目,并确认生成过程中未发生错误。
创建 WPF 客户端应用程序
若要显示 WCF 数据服务 中的数据,请使用基于该服务的数据源创建一个新的 WPF 应用程序。 在本演练后面的部分中,你将向该应用程序中添加数据绑定控件。
创建 WPF 客户端应用程序
在**“解决方案资源管理器”中,右键单击解决方案节点、单击“添加”,然后选择“新建项目”**。
在**“新建项目”对话框中,展开“Visual C#”或“Visual Basic”,然后选择“Windows”**。
选择**“WPF 应用程序”**项目模板。
在**“名称”框中,键入
AdventureWorksSalesEditor
,然后单击“确定”**。Visual Studio 将
AdventureWorksSalesEditor
项目添加到解决方案中。在**“数据”菜单上,单击“显示数据源”**。
将打开**“数据源”**窗口。
在**“数据源”窗口中,单击“添加新数据源”**。
**“数据源配置向导”**打开。
在该向导的**“选择数据源类型”页面上,选择“服务”,然后单击“下一步”**。
在**“添加服务引用”对话框中,单击“发现”**。
Visual Studio 将在当前解决方案中搜索可用服务,并将
AdventureWorksService.svc
添加到**“服务”**框中的可用服务列表中。在**“命名空间”**框中,键入
AdventureWorksService
。在**“服务”框中,单击 AdventureWorksService.svc,然后单击“确定”**。
Visual Studio 将下载该服务信息,然后返回到**“数据源配置向导”**。
在**“添加服务引用”页面上,单击“完成”**。
Visual Studio 将表示该服务返回的数据的节点添加到**“数据源”**窗口中。
定义窗口的用户界面
通过在 WPF 设计器中修改 XAML,将多个按钮添加到该窗口中。 在本演练后面的部分中,你将添加可让用户通过使用这些按钮来查看和更新销售记录的代码。
创建窗口布局
在**“解决方案资源管理器”**中,双击 MainWindow.xaml。
将在 WPF 设计器中打开相应的窗口。
在设计器的 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>
生成项目。
创建数据绑定控件
通过将 SalesOrderHeaders
节点从**“数据源”**窗口拖到设计器中,创建显示客户记录的控件。
创建数据绑定控件
在**“数据源”窗口中,单击“SalesOrderHeaders”节点的下拉菜单,然后选择“详细信息”**。
展开**“SalesOrderHeaders”**节点。
在本示例中,由于一些字段不会显示,因此单击以下节点旁边的下拉菜单,然后选择**“无”**:
CreditCardApprovalCode
ModifiedDate
OnlineOrderFlag
RevisionNumber
rowguid
此操作将阻止 Visual Studio 在下一步中为这些节点创建数据绑定控件。 对于本演练,假定最终用户不需要查看此数据。
从**“数据源”窗口中,将“SalesOrderHeaders”**节点拖到包含按钮的行的下方的网格行。
Visual Studio 将生成 XAML 和代码,它们将创建一组绑定到**“Product”**表中的数据的控件。 有关生成的 XAML 和代码的详细信息,请参阅在 Visual Studio 中将 WPF 控件绑定到数据。
在设计器中,单击**“客户 ID”**标签旁边的文本框。
在**“属性”窗口中,选中“IsReadOnly”**属性旁边的复选框。
设置以下每个文本框的**“IsReadOnly”**属性:
采购订单号
销售订单 ID
销售订单号
从服务中加载数据
使用服务代理对象从服务中加载销售数据,然后将返回的数据分配给 WPF 窗口中 CollectionViewSource 的数据源。
从服务中加载数据
在设计器中,双击文本**“MainWindow”**来创建
Window_Loaded
事件处理程序。将该事件处理程序替换为以下代码。 确保将此代码中的 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("https://localhost:45899/AdventureWorksService.svc")); salesQuery = dataServiceClient.SalesOrderHeaders; ordersViewSource = ((CollectionViewSource)(this.FindResource("salesOrderHeadersViewSource"))); ordersViewSource.Source = salesQuery.Execute(); ordersViewSource.View.MoveCurrentToFirst(); }
Private DataServiceClient As AdventureWorksService.AdventureWorksLTEntities Private SalesQuery As System.Data.Services.Client.DataServiceQuery(Of AdventureWorksService.SalesOrderHeader) Private OrdersViewSource As CollectionViewSource Private Sub Window_Loaded(ByVal Sender As Object, ByVal e As RoutedEventArgs) Handles MyBase.Loaded ' TODO: Modify the port number in the following URI as required. DataServiceClient = New AdventureWorksService.AdventureWorksLTEntities( _ New Uri("https://localhost:32415/AdventureWorksService.svc")) SalesQuery = DataServiceClient.SalesOrderHeaders OrdersViewSource = CType(Me.FindResource("SalesOrderHeadersViewSource"), CollectionViewSource) OrdersViewSource.Source = SalesQuery.Execute() OrdersViewSource.View.MoveCurrentToFirst() End Sub
导航销售记录
添加可让用户通过**“<”和“>”**按钮来滚动销售记录的代码。
使用户能够导航销售记录
在设计器中,双击窗口图面上的**“<”**按钮。
Visual Studio 将打开代码隐藏文件,并为 Click 事件创建新的
backButton_Click
事件处理程序。将以下代码添加到生成的
backButton_Click
事件处理程序中:if (ordersViewSource.View.CurrentPosition > 0) ordersViewSource.View.MoveCurrentToPrevious();
If OrdersViewSource.View.CurrentPosition > 0 Then OrdersViewSource.View.MoveCurrentToPrevious() End If
返回到设计器,然后双击**“>”**按钮。
Visual Studio 将打开代码隐藏文件,并为 Click 事件创建新的
nextButton_Click
事件处理程序。将以下代码添加到生成的
nextButton_Click
事件处理程序中:if (ordersViewSource.View.CurrentPosition < ((CollectionView)ordersViewSource.View).Count - 1) { ordersViewSource.View.MoveCurrentToNext(); }
If OrdersViewSource.View.CurrentPosition < CType(OrdersViewSource.View, CollectionView).Count - 1 Then OrdersViewSource.View.MoveCurrentToNext() End If
保存对销售记录所做的更改
添加可让用户通过使用**“保存更改”**按钮来查看和保存对销售记录所做的更改的代码。
添加保存对销售记录所做更改的功能
在设计器中,双击**“保存更改”**按钮。
Visual Studio 将打开代码隐藏文件,并为 Click 事件创建新的
saveButton_Click
事件处理程序。将以下代码添加到
saveButton_Click
事件处理程序中。AdventureWorksService.SalesOrderHeader currentOrder = (AdventureWorksService.SalesOrderHeader)ordersViewSource.View.CurrentItem; dataServiceClient.UpdateObject(currentOrder); dataServiceClient.SaveChanges();
Dim CurrentOrder As AdventureWorksService.SalesOrderHeader = CType(OrdersViewSource.View.CurrentItem, AdventureWorksService.SalesOrderHeader) DataServiceClient.UpdateObject(CurrentOrder) DataServiceClient.SaveChanges()
测试应用程序
生成并运行应用程序,以验证你是否可以查看和更新客户记录。
测试应用程序
在**“生成”菜单上,单击“生成解决方案”**。 验证解决方案已生成且未发生错误。
按**“Ctrl+F5”**。
Visual Studio 将启动**“AdventureWorksService”**项目,但不对其进行调试。
在**“解决方案资源管理器”中,右键单击“AdventureWorksSalesEditor”**项目。
在上下文菜单上的**“调试”下,单击“启动新实例”**。
将运行应用程序。 验证以下内容:
文本框将显示销售订单 ID 为**“71774”**的第一条销售记录中的数据的不同字段。
可以单击**“>”或“<”**按钮来导航其他销售记录。
在某条销售记录中,在**“注释”框中键入一些文本,然后单击“保存更改”**。
关闭应用程序,然后从 Visual Studio 中再次启动该应用程序。
导航到所更改的销售记录,然后验证相关更改是否在你关闭并重新打开应用程序后得以保留。
关闭该应用程序。
后续步骤
完成本演练后,你可以执行以下相关任务:
了解如何使用 Visual Studio 中的**“数据源”**窗口将 WPF 控件绑定到其他类型的数据源。 有关详细信息,请参阅演练:将 WPF 控件绑定到数据集。
了解如何使用 Visual Studio 中的**“数据源”**窗口显示 WPF 控件中的相关数据(即具有父子关系的数据)。 有关详细信息,请参阅演练:在 WPF 应用程序中显示相关数据。
请参阅
在 Visual Studio 中将 WPF 控件绑定到数据
如何:在 Visual Studio 中将 WPF 控件绑定到数据
演练:将 WPF 控件绑定到数据集
概述
实体框架概述
WPF and Silverlight Designer 概述
数据绑定概述