逐步解說:將 WPF 控制項繫結至 WCF 資料服務
您將在此逐步解說中,建立包含資料繫結控制項的 WPF 應用程式。 這些控制項會繫結至封裝於 WCF 資料服務中的客戶記錄。 您也會加入按鈕,讓客戶可使用這些按鈕檢視及更新記錄。
這個逐步解說將說明下列工作:
建立從 AdventureWorksLT 範例資料庫中的資料產生的實體資料模型。
建立 WCF 資料服務,以將實體資料模型中的資料公開給 WPF 應用程式。
從 [資料來源] 視窗將項目拖曳至 WPF 設計工具,以建立一組資料繫結控制項。
建立可向前及向後巡覽客戶記錄的按鈕。
建立按鈕,以將控制項中的資料變更儲存至 WCF 資料服務及基礎資料來源。
注意事項 您的電腦對於下列指示中某些 Visual Studio 使用者介面項目的名稱或位置,可能會顯示不同的資訊:您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱<Visual Studio 中的自訂開發設定>。
必要條件
您需要下列元件才能完成此逐步解說:
Visual Studio
對執行中的 SQL Server 或 SQL Server Express (其中連結了 AdventureWorksLT 範例資料庫) 執行個體的存取權。 您可以從 CodePlex 網站 下載 AdventureWorksLT 資料庫。
預先了解下列概念也有助於完成此逐步解說 (但非必要):
WCF 資料服務。 如需詳細資訊,請參閱WCF Data Services 概觀。
WCF 資料服務中的資料模型。
實體資料模型及 ADO.NET Entity Framework。 如需詳細資訊,請參閱Entity Framework 概觀。
使用 WPF 設計工具。 如需詳細資訊,請參閱WPF Designer Overview。
WPF 資料繫結。 如需詳細資訊,請參閱資料繫結概觀。
建立服務專案
建立 WCF 資料服務的專案以開始此逐步解說。
建立服務專案
啟動 Visual Studio。
在 [檔案] 功能表中,指向 [新增],然後按一下 [專案]。
展開 [Visual C#] 或 [Visual Basic],然後選取 [Web]。
選取 [ASP.NET Web 應用程式] 專案範本。
在 [名稱] 方塊中,輸入 AdventureWorksService,然後按一下 [確定]。
Visual Studio 隨即建立 AdventureWorksService 專案。
在方案總管中的 Default.aspx 上按一下滑鼠右鍵,並選取 [刪除]。 在此逐步解說中不需要此檔案。
建立服務的實體資料模型
若要使用 WCF 資料服務將資料公開給應用程式,您必須定義服務的資料模型。 WCF 資料服務支援兩種類型的資料模型:實體資料模型及自訂資料模型,後者使用實作 IQueryable 介面的 Common Language Runtime (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 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
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。 該程式碼也會更新 InitializeService 方法,允許服務的用戶端對 SalesOrderHeader 實體具有完整的讀取/寫入存取權。
建置專案,並確認專案建置無誤。
建立 WPF 用戶端應用程式
若要從 WCF 資料服務顯示資料,請使用以服務為基礎的資料來源,建立新的 WPF 應用程式。 稍後您將在此逐步解說中,將資料繫結控制項加入至應用程式。
建立 WPF 用戶端應用程式
在方案總管中,在方案上按一下滑鼠右鍵,再按一下 [加入],然後選取 [新增專案]。
在 [新增專案] 對話方塊中,展開 [Visual C#] 或 [Visual Basic],然後選取 [視窗]。
選取 [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 和程式碼,其可建立一組繫結至 Products 資料表之資料的控制項。 如需產生之 XAML 和程式碼的詳細資訊,請參閱 將 WPF 控制項繫結至 Visual Studio 中的資料。
在設計工具中,按一下 [Customer ID] 標籤旁邊的文字方塊。
在 [屬性] 視窗中,選取 IsReadOnly 屬性旁邊的核取方塊。
為下列每個文字方塊設定 IsReadOnly 屬性:
Purchase Order Number
Sales Order ID
Sales Order Number
從服務載入資料
使用服務 Proxy 物件從服務載入銷售資料,然後將傳回的資料指派給 WPF 視窗中 CollectionViewSource 的資料來源。
從服務載入資料
在設計工具中,按兩下文字 MainWindow,以建立 Window_Loaded 事件處理常式。
以下列程式碼取代事件處理常式。 確認您是使用開發電腦的本機主機位址,取代此程式碼中的 localhost 位址。
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("http://localhost:32415/AdventureWorksService.svc")) SalesQuery = DataServiceClient.SalesOrderHeaders OrdersViewSource = CType(Me.FindResource("SalesOrderHeadersViewSource"), CollectionViewSource) OrdersViewSource.Source = SalesQuery.Execute() OrdersViewSource.View.MoveCurrentToFirst() End Sub
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(); }
巡覽銷售記錄
加入可讓使用者使用 < 及 > 按鈕捲動銷售記錄的程式碼。
讓使用者巡覽銷售記錄
在設計工具中,按兩下視窗介面上的 < 按鈕。
Visual Studio 會開啟程式碼後置檔案,並建立 Click 事件的新 backButton_Click 事件處理常式。
將下列程式碼加入至產生的 backButton_Click 事件處理常式:
If OrdersViewSource.View.CurrentPosition > 0 Then OrdersViewSource.View.MoveCurrentToPrevious() End If
if (ordersViewSource.View.CurrentPosition > 0) ordersViewSource.View.MoveCurrentToPrevious();
回到設計工具,然後按兩下 > 按紐。
Visual Studio 會開啟程式碼後置檔案,並建立 Click 事件的新 nextButton_Click 事件處理常式。
將下列程式碼加入至產生的 nextButton_Click 事件處理常式:
If OrdersViewSource.View.CurrentPosition < CType(OrdersViewSource.View, CollectionView).Count - 1 Then OrdersViewSource.View.MoveCurrentToNext() End If
if (ordersViewSource.View.CurrentPosition < ((CollectionView)ordersViewSource.View).Count - 1) { ordersViewSource.View.MoveCurrentToNext(); }
儲存銷售記錄的變更
加入程式碼,讓使用者可以使用 [儲存變更] 按鈕檢視及儲存銷售記錄的變更。
加入可儲存銷售記錄變更的功能
在設計工具中,按兩下 [儲存變更] 按鈕。
Visual Studio 會開啟程式碼後置檔案,並建立 Click 事件的新 saveButton_Click 事件處理常式。
將下列程式碼加入至 saveButton_Click 事件處理常式。
Dim CurrentOrder As AdventureWorksService.SalesOrderHeader = CType(OrdersViewSource.View.CurrentItem, AdventureWorksService.SalesOrderHeader) DataServiceClient.UpdateObject(CurrentOrder) DataServiceClient.SaveChanges()
AdventureWorksService.SalesOrderHeader currentOrder = (AdventureWorksService.SalesOrderHeader)ordersViewSource.View.CurrentItem; dataServiceClient.UpdateObject(currentOrder); dataServiceClient.SaveChanges();
測試應用程式
建置並執行應用程式,以確認您可以檢視及更新客戶記錄。
若要測試應用程式
在 [建置] 功能表中,按一下 [建置方案]。 確認方案建置無誤。
按 CTRL+F5 鍵。
Visual Studio 會啟動 AdventureWorksService 專案且不進行偵錯。
在方案總管中,在 AdventureWorksSalesEditor 上按一下滑鼠右鍵。
在內容功能表的 [偵錯] 下,按一下 [開始新執行個體]。
應用程式隨即執行。 驗證下列各項:
這些文字方塊是從第一筆銷售記錄 (具有銷售訂單 ID 71774) 的資料顯示不同的欄位。
您可以按一下 > 或 < 按鈕,巡覽其他銷售記錄。
在其中一個銷售記錄中,在 [註解] 方塊中輸入部分文字,然後按一下 [儲存變更]。
關閉應用程式,然後從 Visual Studio 再次啟動應用程式。
巡覽至您變更過的銷售記錄,並確認變更在您關閉及重新開啟應用程式之後仍然存在。
關閉應用程式。
後續步驟
完成此逐步解說後,您可以執行下列相關的工作:
學習如何使用 Visual Studio 中的 [資料來源] 視窗,將 WPF 控制項繫結至其他資料來源類型。 如需詳細資訊,請參閱逐步解說:將 WPF 控制項繫結到資料集。
學習如何使用 Visual Studio 中的 [資料來源] 視窗,顯示 WPF 控制項中的相關資料 (也就是具有父子關聯性中的資料)。 如需詳細資訊,請參閱逐步解說:顯示 WPF 應用程式中的相關資料。
請參閱
工作
如何:將 WPF 控制項繫結至 Visual Studio 中的資料
概念
將 WPF 控制項繫結至 Visual Studio 中的資料