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