什麼是系結來源? (WPF .NET)
在資料繫結中,繫結來源物件是指您取得資料的來源物件。 本文討論可作為繫結來源的物件類型,例如 .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 objects
您可以在
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 會以完全信任的安全性執行。 所有資料繫結都會以與執行應用程式的使用者相同的存取權執行。