演练:将 WPF 控件绑定到实体数据模型
在本演练中,您将创建一个包含数据绑定控件的 WPF 应用程序。这些控件将绑定到在实体数据模型中封装的客户记录。您还将添加客户可用于导航客户记录并保存对记录所做更改的按钮。
本演练阐释了以下任务:
创建一个 WPF 应用程序和一个利用 AdventureWorksLT 示例数据库中的数据生成的实体数据模型。
通过将一个实体从**“数据源”**窗口中拖动到 WPF 设计器的一个窗口中,创建一组数据绑定控件。
创建用于向前/向后浏览客户记录的按钮。
创建一个用于将控件中的更改保存到实体数据模型和基础数据源中的按钮。
说明 对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
系统必备
您需要以下组件来完成本演练:
Visual Studio
对附加了 AdventureWorksLT 示例数据库且正在运行的 SQL Server 或 SQL Server Express 实例的访问权限。您可以从 CodePlex 网站下载 AdventureWorksLT 数据库。
事先了解以下概念也很有用,但对于完成本演练并不是必需的:
实体数据模型和 ADO.NET Entity Framework。有关更多信息,请参见 Introducing the Entity Framework。
使用 WPF 设计器。有关更多信息,请参见 WPF and Silverlight Designer 概述。
WPF 数据绑定。有关更多信息,请参见数据绑定概述。
创建项目
创建新的 WPF 项目以显示客户记录。
创建项目
启动 Visual Studio。
在**“文件”菜单上指向“新建”,再单击“项目”**。
展开**“Visual Basic”或“Visual C#”,然后选择“Windows”**。
选择**“WPF 应用程序”**项目模板。
在**“名称”框中,键入 AdventureWorksCustomerEditor,再单击“确定”**。
Visual Studio 将创建 AdventureWorksCustomerEditor 项目。
为应用程序创建实体数据模型
您必须先为应用程序定义数据模型并将此模型添加到“数据源”窗口中,然后才能创建数据绑定控件。在此演练中,您将创建一个实体数据模型。
创建实体数据模型
在**“数据”菜单上,单击“添加新数据源”打开“数据源配置向导”**。
在**“选择数据源类型”页上,单击“数据库”,然后单击“下一步”**。
在**“选择数据库模型”页上,单击“实体数据模型”,然后单击“下一步”**。
在**“选择模型内容”页上,单击“从数据库生成”,然后单击“下一步”**。
在**“选择您的数据连接”**页上,执行下列操作之一:
如果下拉列表中包含到 AdventureWorksLT 示例数据库的数据连接,请选择该连接。
- 或 -
单击**“新建连接”**并创建到 AdventureWorksLT 数据库的连接。
确保选择了**“将 App.Config 中的实体连接设置另存为”选项,然后单击“下一步”**。
在**“选择数据库对象”页上,展开“表”,然后选择“Customer”**表。
单击**“完成”**。
将在设计器中打开 Model1.edmx 文件。
生成项目。
定义窗口的用户界面
通过在 WPF 设计器中修改 XAML 向窗口中添加按钮。
定义窗口的用户界面
在**“解决方案资源管理器”**中,双击 MainWindow.xaml。
将在 WPF 设计器中打开相应的窗口。
在设计器的 XAML 视图中,在 <Grid> 标记之间添加以下代码:
<Grid.RowDefinitions> <RowDefinition Height="75" /> <RowDefinition Height="425" /> </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>
生成项目。
创建数据绑定控件
通过将对象从**“数据源”**窗口拖动到 WPF 设计器,创建显示客户记录的控件。
创建数据绑定控件
在**“数据”菜单上,单击“显示数据源”**。
在**“数据源”窗口中,单击“Customers”节点的下拉菜单,并选择“详细信息”**。
展开**“Customers”**节点。
在本示例中,由于一些字段不会显示,因此单击以下节点旁边的下拉菜单并选择**“无”**:
NameStyle
PasswordHash
PasswordSalt
rowGuid
ModifiedDate
从**“数据源”窗口中,将“Customers”**节点拖动到按钮下面的区域内。
在设计器中,单击**“Customer ID”(客户 ID)**标签旁边的文本框。
在**“属性”窗口中,选中“IsReadOnly”**属性旁边的复选框。
生成项目。
导航客户记录
添加可让客户通过**“<”和“>”**按钮来浏览客户记录的代码。
使用户能够导航客户记录
在设计器中,双击**“<”**按钮。
Visual Studio 将打开代码隐藏文件,并为 Click 事件创建新的 backButton_Click 事件处理程序。
修改 Window_Loaded 事件处理程序,使 CustomersViewSource 和 AdventureWorksLTEntities 位于该方法的外部,并使它们在整个窗体中是可访问的。仅向窗体全局声明这些项,并在 Window_Loaded 事件处理程序内为这些项赋值,类似下面这样:
Dim CustomersViewSource As System.Windows.Data.CollectionViewSource Dim AdventureWorksLTEntities As AdventureWorksCustomerEditor.AdventureWorksLTEntities Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded CustomersViewSource = CType(Me.FindResource("CustomersViewSource"), System.Windows.Data.CollectionViewSource) AdventureWorksLTEntities = New AdventureWorksCustomerEditor.AdventureWorksLTEntities() 'Load data into Customers. You can modify this code as needed. Dim CustomersQuery As System.Data.Objects.ObjectQuery(Of AdventureWorksCustomerEditor.Customer) = Me.GetCustomersQuery(AdventureWorksLTEntities) CustomersViewSource.Source = CustomersQuery.Execute(System.Data.Objects.MergeOption.AppendOnly) End Sub
private System.Windows.Data.CollectionViewSource customersViewSource; private AdventureWorksCustomerEditor.AdventureWorksLTEntities adventureWorksLTEntities; private void Window_Loaded(object sender, RoutedEventArgs e) { adventureWorksLTEntities = new AdventureWorksCustomerEditor.AdventureWorksLTEntities(); // Load data into Customers. You can modify this code as needed. customersViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("customersViewSource"))); System.Data.Objects.ObjectQuery<AdventureWorksCustomerEditor.Customer> customersQuery = this.GetCustomersQuery(adventureWorksLTEntities); customersViewSource.Source = customersQuery.Execute(System.Data.Objects.MergeOption.AppendOnly); }
将以下代码添加到 backButton_Click 事件处理程序中:
If CustomersViewSource.View.CurrentPosition > 0 Then CustomersViewSource.View.MoveCurrentToPrevious() End If
if (customersViewSource.View.CurrentPosition > 0) customersViewSource.View.MoveCurrentToPrevious();
返回到设计器,并双击 > 按钮。
Visual Studio 将打开代码隐藏文件,并为 Click 事件创建新的 nextButton_Click 事件处理程序。
将以下代码添加到 nextButton _Click 事件处理程序中:
If CustomersViewSource.View.CurrentPosition < CType(CustomersViewSource.View, CollectionView).Count - 1 Then CustomersViewSource.View.MoveCurrentToNext() End If
if (customersViewSource.View.CurrentPosition < ((CollectionView)customersViewSource.View).Count - 1) customersViewSource.View.MoveCurrentToNext();
检查点
生成并运行您的项目,以确保编译代码并且您能够导航客户记录。
测试应用程序
按 F5。
这将生成并运行应用程序。确认以下事项:
将显示客户数据。
可以单击**“>”或“<”**按钮来导航客户记录。
保存对客户记录所做的更改
添加可让用户通过**“Save changes”(保存更改)**按钮来保存对客户记录所做的更改的代码。
添加保存对客户记录所做更改的功能
在设计器中双击**“Save changes”(保存更改)**按钮。
Visual Studio 将打开代码隐藏文件,并创建新的 saveButton_Click 事件处理程序。
将以下代码添加到 saveButton_Click 事件处理程序中:
AdventureWorksLTEntities.SaveChanges()
adventureWorksLTEntities.SaveChanges();
测试应用程序
生成并运行应用程序,以确认应用程序显示客户记录,并且您能够保存对客户记录所做的更改。
测试应用程序
按 F5。
编辑某条客户记录,然后单击**“Save changes”(保存更改)**。
关闭应用程序,然后按 F5 再次启动应用程序。
导航到已更改的客户记录,验证是否已保存更改。
关闭应用程序。
后续步骤
完成本演练后,您可以执行以下相关任务:
了解如何使用 Visual Studio 中的**“数据源”**窗口将 WPF 控件绑定到其他类型的数据源。有关更多信息,请参见演练:将 WPF 控件绑定到 WCF 数据服务和演练:将 WPF 控件绑定到数据集。
了解如何使用 Visual Studio 中的**“数据源”**窗口来显示 WPF 控件中的相关数据(即具有父子关系的数据)。有关更多信息,请参见演练:在 WPF 应用程序中显示相关数据。
请参见
任务
如何:在 Visual Studio 中将 WPF 控件绑定到数据
概念
在 Visual Studio 中将 WPF 控件绑定到数据
WPF and Silverlight Designer 概述