共用方式為


將 WPF 控制項系結至 WCF 數據服務

在本逐步解說中,您將建立包含數據綁定控件的 WPF 應用程式。 這些控制項會系結至封裝在 WCF 數據服務中的客戶記錄。 您也會新增客戶可用來檢視和更新記錄的按鈕。

本逐步解說將說明下列工作:

  • 建立從 AdventureWorksLT 範例資料庫中數據產生的實體數據模型。

  • 建立 WCF 數據服務,以將實體數據模型中的數據公開給 WPF 應用程式。

  • 將項目從 數據源 視窗拖曳至 WPF 設計師,以建立一組數據綁定控件。

  • 建立可向前和向後巡覽客戶記錄的按鈕。

  • 建立按鈕,將控件中的數據變更儲存至 WCF Data Service 和基礎數據源。

備註

本文中的指示說明 Visual Studio 中可用的互動式開發體驗 (IDE) 最新版本。 您的電腦可能會顯示某些使用者介面元素的不同名稱或位置。 您可能使用不同的 Visual Studio 版本或不同的環境設定。 如需詳細資訊,請參閱 個人化 IDE

先決條件

您需要下列元件才能完成本操作指南:

  • Visual Studio

  • 存取一個正在運行並已附加 AdventureWorksLT 範例資料庫的 SQL Server 或 SQL Server Express 實例。 若要下載資料庫,請參閱 AdventureWorks 範例資料庫

先前瞭解下列概念也很有幫助,但不需要以完成導覽為前提:

建立服務專案

  1. 建立 C# 或 Visual Basic ASP.NET Web 應用程式 專案,以啟動此逐步解說。 將專案命名為 AdventureWorksService

  2. [方案總管] 中,以滑鼠右鍵按兩下 Default.aspx ,然後選取 [ 刪除]。 本操作指南不需要此檔案。

建立服務的實體數據模型

若要使用 WCF 資料服務向應用程式公開資料,您必須定義服務的數據模型。 WCF 數據服務支援兩種類型的數據模型:實體數據模型,以及使用實作 介面的 Common Language Runtime (CLR) 物件 IQueryable<T> 所定義的自定義數據模型。 在本引導指南中,您會為資料模型建立實體資料模型。

  1. 在 [專案] 功能表上,按一下 [新增項目]。

  2. 在 [已安裝的範本] 清單中,按一下 [資料],然後選取 [ADO.NET 實體資料模型] 專案項目。

  3. 將名稱變更為 AdventureWorksModel.edmx,然後按兩下 [ 新增]。

    [c0>實體資料模型精靈] 隨即開啟。

  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 類別,使其衍生自 DataService<T> 在實體資料模型中的物件內容類別上運作的 AdventureWorksLTEntities 。 它也會更新 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. 在設計工具中,按兩下 [客戶標識符] 標籤旁的文字框。

  6. 在 [ 屬性] 視窗中,選取 IsReadOnly 屬性旁的複選框。

  7. 設定下列每一個文字框的 IsReadOnly 屬性:

    • 採購單號碼

    • 銷售訂單標識碼

    • 銷售訂單號碼

從服務載入數據

使用服務代理物件從服務載入銷售數據。 然後將傳回的數據指派給 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 會開啟程式碼後置檔案,並為backButton_Click事件建立新的Click事件處理程式。

  2. 將下列程式代碼新增至產生的 backButton_Click 事件處理程式:

    if (ordersViewSource.View.CurrentPosition > 0)
        ordersViewSource.View.MoveCurrentToPrevious();
    
  3. 返回設計工具,然後按兩下 > 按鈕。

    Visual Studio 會開啟程式碼後置檔案,並為nextButton_Click事件建立新的Click事件處理程式。

  4. 將下列程式代碼新增至產生的 nextButton_Click 事件處理程式:

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

儲存銷售記錄的變更

新增程式代碼,讓使用者使用 [儲存變更] 按鈕來檢視和儲存銷售記錄的 變更

  1. 在設計工具中,按兩下 [ 儲存變更 ] 按鈕。

    Visual Studio 會開啟程式碼後置檔案,並為saveButton_Click事件建立新的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. 在滑鼠右鍵功能表(內容功能表)的 偵錯 底下,按一下 啟動新實例

    應用程式運行。 確認下列各項:

    • 文本框會顯示與第一筆銷售記錄不同的數據欄位,其中包含銷售訂單標識碼 71774

    • 您可以按下 >< 按鈕,流覽其他銷售記錄。

  5. 在其中一筆銷售記錄中,於 [ 批注 ] 方塊中輸入一些文字,然後選取 [ 儲存變更]。

  6. 關閉應用程式,然後從 Visual Studio 再次啟動應用程式。

  7. 流覽至您變更的銷售記錄,並確認變更在您關閉並重新開啟應用程式之後會持續發生。

  8. 關閉應用程式。

後續步驟

完成本逐步解說之後,您可以執行下列相關工作: