HOW TO:使用專案資料來源繫結資料 (WCF Data Services)
您可以在 WCF Data Services 用戶端應用程式中,建立以產生之資料物件為基礎的資料來源。 當您使用 [加入服務參考] 對話方塊加入資料服務的參考時,便會建立一個專案資料來源以及所產生的用戶端資料類別。系統會針對資料服務所公開的每個實體集,建立一個資料來源。 您可以從 [資料來源] 視窗將這些資料來源項目拖曳至設計工具來建立表單,以顯示來自服務的資料。 這些項目會成為繫結至資料來源的控制項。 在執行期間,資料會繫結至 DataServiceCollection<T> 類別的執行個體,其中會填入資料服務查詢傳回的物件。 如需詳細資訊,請參閱將資料繫結至控制項 (WCF Data Services)。
本主題的範例使用 Northwind 範例資料服務和自動產生的用戶端資料服務類別。 此服務和用戶端資料類別會在您完成 WCF Data Services 快速入門時建立。
使用 WPF 視窗中的專案資料來源
在 WPF 專案中,將參考加入至 Northwind 資料服務。 如需詳細資訊,請參閱 HOW TO:加入資料服務參考 (WCF Data Services)。
在 [資料來源] 視窗中,展開 [NorthwindEntities] 專案資料來源中的 [Customers] 節點。
按一下 [CustomerID] 項目,選取清單的 [ComboBox],然後將 [CustomerID] 項目從 [Customers] 節點拖曳至設計工具。
這會在視窗的 XAML 檔案中,建立下列物件項目:
CollectionViewSource 物件,名為 customersViewSource。 最上層 Grid 物件項目的 DataContext 屬性會設成這個新的 CollectionViewSource。
資料繫結 ComboBox,名為 CustomerID。
將 [Orders] 導覽屬性拖曳至設計工具。
這會在視窗的 XAML 檔案中,建立下列其他物件項目:
第二個 CollectionViewSource 物件,名為 customersOrdersViewSource,其資料來源是 customerViewSource。
資料繫結 DataGrid 控制項,名為 ordersDataGrid。
(選擇項) 將其他項目從 [Customers] 節點拖曳至設計工具。
開啟表單的程式碼頁並加入下列 using 陳述式 (在 Visual Basic 中為 Imports):
using System.Data.Services.Client; using NorthwindClient.Northwind;
在定義表單的部分類別中,加入下列可建立 ObjectContext 執行個體並定義 customerID 常數的程式碼。
Private context As NorthwindEntities Private customersViewSource As CollectionViewSource Private trackedCustomers As DataServiceCollection(Of Customer) Private Const customerCountry As String = "Germany" Private Const svcUri As String = "https://localhost:12345/Northwind.svc/"
private NorthwindEntities context; private CollectionViewSource customersViewSource; private DataServiceCollection<Customer> trackedCustomers; private const string customerCountry = "Germany"; private const string svcUri = "https://localhost:12345/Northwind.svc/";
在設計工具中選取視窗。
注意
請確定您選取的是視窗本身,而不是選擇視窗的內容。如果已選取視窗,接近 [屬性] 視窗上方的 [名稱] 文字方塊應包含該視窗的名稱。
在 [屬性] 視窗中,選擇 [事件] 按鈕。
尋找 [已載入] 事件,然後按兩下這個事件旁的下拉式清單。
Visual Studio 會開啟視窗的程式碼後置檔案,然後產生 Loaded 事件處理常式。
在新建立的 Loaded 事件處理常式中,複製並貼上下列程式碼。
' Initialize the context for the data service. context = New NorthwindEntities(New Uri(svcUri)) ' Create a LINQ query that returns customers with related orders. Dim customerQuery = From cust In context.Customers.Expand("Orders") _ Where cust.Country = customerCountry _ Select cust ' Create a new collection for binding based on the LINQ query. trackedCustomers = New DataServiceCollection(Of Customer)(customerQuery) try ' Get the customersViewSource resource and set the binding to the collection. customersViewSource = _ CType(Me.FindResource("customersViewSource"), CollectionViewSource) customersViewSource.Source = trackedCustomers customersViewSource.View.MoveCurrentToFirst() Catch ex As DataServiceQueryException MessageBox.Show("The query could not be completed:\n" + ex.ToString()) Catch ex As InvalidOperationException MessageBox.Show("The following error occurred:\n" + ex.ToString()) End Try
// Initialize the context for the data service. context = new NorthwindEntities(new Uri(svcUri)); // Create a LINQ query that returns customers with related orders. var customerQuery = from cust in context.Customers.Expand("Orders") where cust.Country == customerCountry select cust; // Create a new collection for binding based on the LINQ query. trackedCustomers = new DataServiceCollection<Customer>(customerQuery); try { // Get the customersViewSource resource and set the binding to the collection. customersViewSource = ((CollectionViewSource)(this.FindResource("customersViewSource"))); customersViewSource.Source = trackedCustomers; customersViewSource.View.MoveCurrentToFirst(); } catch (DataServiceQueryException ex) { MessageBox.Show("The query could not be completed:\n" + ex.ToString()); } catch (InvalidOperationException ex) { MessageBox.Show("The following error occurred:\n" + ex.ToString()); }
這個程式碼會根據 LINQ 查詢執行傳回 Customers 物件的 IEnumerable<T>,以及 Northwind 資料服務的相關 Orders 物件,建立 Customers 型別的 DataServiceCollection<T>,然後繫結至 customersViewSource。
使用 Windows Form 中的專案資料來源
在 [資料來源] 視窗中,展開 [NorthwindEntities] 專案資料來源中的 [Customers] 節點。
按一下 [CustomerID] 項目,選取清單的 [ComboBox],然後將 [CustomerID] 項目從 [Customers] 節點拖曳至設計工具。
這會在表單上建立下列控制項:
BindingSource 執行個體,名為 customersBindingSource。
BindingNavigator 執行個體,名為 customersBindingNavigator。 您可以刪除這個不再需要的控制項。
資料繫結 ComboBox,名為 CustomerID。
將 [Orders] 導覽屬性拖曳至表單。
這會建立 ordersBindingSource 控制項,且控制項的 DataSource 屬性設為 customersBindingSource 和 DataMember 屬性設為 Customers。 表單上也會建立 ordersDataGridView 資料繫結控制項,並伴隨著標示適當的標籤控制項。
(選擇項) 將其他項目從 [Customers] 節點拖曳至設計工具。
開啟表單的程式碼頁並加入下列 using 陳述式 (在 Visual Basic 中為 Imports):
Imports System.Data.Services.Client Imports NorthwindClient.Northwind
using System.Data.Services.Client; using NorthwindClient.Northwind;
在定義表單的部分類別中,加入下列可建立 ObjectContext 執行個體並定義 customerID 常數的程式碼。
Private context As NorthwindEntities Private trackedCustomers As DataServiceCollection(Of Customer) Private Const customerCountry As String = "Germany" Private Const svcUri As String = "http:'localhost:12345/Northwind.svc/"
private NorthwindEntities context; private DataServiceCollection<Customer> trackedCustomers; private const string customerCountry = "Germany"; private const string svcUri = "https://localhost:12345/Northwind.svc/";
在表單設計工具中,按兩下表單。
這樣會開啟表單的字碼頁,並且建立用於處理表單之 Load 事件的方法。
在 Load 事件處理常式中,複製並貼入下列程式碼。
' Initialize the context for the data service. context = New NorthwindEntities(New Uri(svcUri)) Try ' Create a LINQ query that returns customers with related orders. Dim customerQuery = From cust In context.Customers.Expand("Orders") _ Where cust.Country = customerCountry _ Select cust ' Create a new collection for binding based on the LINQ query. trackedCustomers = New DataServiceCollection(Of Customer)(customerQuery) 'Bind the Customers combobox to the collection. customersComboBox.DisplayMember = "CustomerID" customersComboBox.DataSource = trackedCustomers Catch ex As DataServiceQueryException MessageBox.Show("The query could not be completed:\n" + ex.ToString()) Catch ex As InvalidOperationException MessageBox.Show("The following error occurred:\n" + ex.ToString())
// Initialize the context for the data service. context = new NorthwindEntities(new Uri(svcUri)); try { // Create a LINQ query that returns customers with related orders. var customerQuery = from cust in context.Customers.Expand("Orders") where cust.Country == customerCountry select cust; // Create a new collection for binding based on the LINQ query. trackedCustomers = new DataServiceCollection<Customer>(customerQuery); //Bind the Customers combobox to the collection. customersComboBox.DisplayMember = "CustomerID"; customersComboBox.DataSource = trackedCustomers; } catch (DataServiceQueryException ex) { MessageBox.Show("The query could not be completed:\n" + ex.ToString()); } catch (InvalidOperationException ex) { MessageBox.Show("The following error occurred:\n" + ex.ToString()); }
這個程式碼會根據 DataServiceQuery<TElement> 執行傳回 Northwind 資料服務之 Customers的 IEnumerable<T>,建立 Customers 型別的 DataServiceCollection<T>,然後繫結至 customersBindingSource。
請參閱
工作
HOW TO:將資料繫結至 Windows Presentation Foundation 項目 (WCF Data Services)