繫結來源概觀
更新:2007 年 11 月
在資料繫結 (Data Binding) 中,繫結來源 (來源) 物件是指您取得資料的來源物件。本主題討論可以當做來源的物件型別。
這個主題包含下列章節。
- 繫結的來源
- 使用 CLR 類別做為繫結來源物件
- 使用整個物件做為繫結來源
- 使用集合物件做為繫結來源
- 使用權限要求
- 相關主題
繫結的來源
Windows Presentation Foundation (WPF) 資料繫結支援下列繫結來源類型:
繫結來源 |
描述 |
---|---|
Common Language Runtime (CLR) 物件 |
您可以繫結至公用屬性、子屬性,以及任何 Common Language Runtime (CLR) 物件的索引子。繫結引擎會使用 CLR 反映取得這些屬性的值。此外,實作 ICustomTypeDescriptor 或擁有已註冊之 TypeDescriptionProvider 的物件也會使用繫結引擎。 如需如何實作可做為來源物件之類別的詳細資訊,請參閱下一節。 |
ADO.NET 資料 |
您可以繫結至 ADO.NET 物件,例如 DataTable。ADO.NET DataView 會實作 IBindingList,以提供繫結引擎所接聽的變更告知。 如需範例,請參閱繫結至 ADO.NET 資料集範例。 |
XML 資料 |
您可以在 XmlNode、XmlDocument 或 XmlElement 上繫結至並執行 XPath 查詢。有一種簡便的方法可以存取在標記中做為繫結來源的 XML 資料,就是使用 XmlDataProvider 物件。如需詳細資訊,請參閱 HOW TO:使用 XMLDataProvider 和 XPath 查詢繫結至 XML 資料。 您也可以使用 LINQ for XML 繫結至 XElement 或 XDocument,或繫結至在這些類型物件上執行的查詢結果。有一種簡便的方法可以存取在標記中做為繫結來源的 XML 資料,就是使用 ObjectDataProvider 物件。如需詳細資訊,請參閱HOW TO:繫結至 XML 查詢結果的 XDocument、XElement 或 LINQ。 |
您可以繫結至任何 DependencyObject 的相依性屬性。如需範例,請參閱HOW TO:繫結兩個控制項的屬性。 |
使用 CLR 類別做為繫結來源物件
本節討論在實作 CLR 類別以做為來源物件時,您必須知道的幾件事情。
提供變更告知
如果使用 OneWay 或 TwoWay 繫結 (想要在來源屬性動態變更時更新 UI),您必須實作適當的屬性變更通知機制。建議的機制是由 CLR 類別實作 INotifyPropertyChanged 介面。如需詳細資訊,請參閱 HOW TO:實作屬性變更通知。
如果未實作 INotifyPropertyChanged,則必須自行安排通知系統,以確保繫結中所使用的都是最新的資料。您可以針對想要通知變更的每個屬性,支援 PropertyChanged 模式,以提供變更通知。若要支援這個模式,請定義每個屬性的 PropertyNameChanged 事件,其中 PropertyName 是屬性的名稱。您可在每次屬性變更時,引發這個事件。
如果來源物件實作適當的通知機制,系統就會自動執行目標更新。如果來源物件因為任何原因而未提供適當的屬性變更通知,您可以選擇使用 UpdateTarget 方法明確更新目標屬性。
其他特性
下列清單提供必須注意的其他重點:
如果要在 XAML 中建立物件,此類別必須擁有預設建構函式。在某些 .NET 語言 (例如 C#) 中,可能會為您建立預設的建構函式。
當做繫結來源屬性的屬性必須是類別的公用屬性。您不能存取明確定義的介面屬性以做為繫結之用,而且這種屬性也不能是保護的 (Protected)、私用的 (Private) 或沒有基底實作的虛擬屬性。
您不能繫結至 CLR 類別的公用欄位。
類別中宣告的屬性其型別就是傳遞至繫結的型別。不過,繫結最終使用的型別需視繫結目標屬性 (而非來源屬性) 的型別而定。如果型別不同,您可能需要撰寫轉換器來處理自訂屬性一開始傳遞到繫結的方式。如需詳細資訊,請參閱 IValueConverter。
使用整個物件做為繫結來源
您可以使用整個物件做為繫結的來源。使用的方法是利用 Source 或 DataContext 屬性將物件指定成繫結來源,然後除了空白繫結宣告以外,不提供任何路徑:{Binding}。可以使用這種方法的案例包括繫結到屬於字串型別的物件、繫結到內含您所需之多個屬性的物件,或是繫結到集合物件。如需繫結到整個集合物件的範例,請參閱 HOW TO:使用含階層式資料的主從式模式。
請注意,您可能必須套用自訂邏輯,如此資料對於繫結目標屬性來說才有意義。自訂邏輯可能採用自訂轉換子 (如果預設型別轉換不存在的話) 或 DataTemplate 的形式。如需轉換器的詳細資訊,請參閱資料繫結概觀的<資料轉換>一節。如需資料範本的詳細資訊,請參閱資料範本化概觀。
使用集合物件做為繫結來源
您要做為來源的物件通常是多個自訂物件的集合,其中各個物件分別代表當做重複繫結單一執行個體之來源的資料物件。例如,您可能有一個由 CustomerOrder 組成的 CustomerOrders 集合,而您的應用程式會逐一查看這個集合來判斷訂單數量,以及各筆訂單所包含的資料。
您可以列舉實作 IEnumerable 介面的任何物件。不過,若要設定動態繫結,讓集合中的插入或刪除作業自動更新 UI,則集合必須實作 INotifyCollectionChanged 介面。這個介面會公開 (Expose) 每次基礎集合變更時必須引發的事件。
WPF 提供 ObservableCollection<T> 類別,這是會公開 INotifyCollectionChanged 介面的資料集合的內建實作。此集合中的個別資料物件必須滿足前面各章節中所說明的需求。如需範例,請參閱 HOW TO:建立和繫結至 ObservableCollection。實作自己的集合之前,請考慮使用 ObservableCollection<T> 或其中一個現有的集合類別,例如 List<T>、Collection<T> 和 BindingList<T> 等等。
WPF 絕不會直接繫結至集合。如果指定集合做為資料來源,WPF 實際上會繫結至集合的預設檢視。如需預設檢視的詳細資訊,請參閱資料繫結概觀。
如果您擁有進階案例,而想實作自己的集合,請考慮使用 IList,提供可依索引個別存取,也因而產生最佳效能之物件的非泛型集合。
使用權限要求
下表摘要說明在以完全信任或部分信任執行的應用程式中,可以當做繫結目標的屬性型別:
屬性型別 (所有存取修飾詞) |
CLR 屬性 |
CLR 屬性 |
相依性屬性 |
相依性 屬性 |
---|---|---|---|---|
信任層級 |
完全信任 |
部分信任 |
完全信任 |
部分信任 |
公用類別 |
是 |
是 |
是 |
是 |
私用類別 |
是 |
否 |
是 |
是 |
這個表格說明資料繫結中使用權限需求的下列相關重點:
對於 CLR 屬性,只要繫結引擎能夠使用反映存取來源屬性,資料繫結就有作用。否則,繫結引擎將會發出找不到屬性的警告,並使用遞補值或預設值 (如果有的話)。
您永遠都可以繫結至相依性屬性。
XML 繫結也有類似的使用權限需求:在部分信任沙箱中,如果 XmlDataProvider 沒有存取指定之資料的使用權限,它將會失敗。
如需部分信任安全性的詳細資訊,請參閱 Windows Presentation Foundation 部分信任安全性。