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