系結來源概觀 (WPF .NET)
在資料繫結中,繫結來源物件是指您取得資料的來源物件。 本文討論可作為系結來源的物件類型,例如 .NET CLR 物件、XML 和 DependencyObject 物件。
系結來源類型
Windows Presentation Foundation (WPF) 資料系結支援下列系結來源類型:
.NET Common Language Runtime (CLR) 物件
您可以系結至任何 Common Language Runtime (CLR) 物件的公用屬性、子屬性和索引子。 系結引擎會使用 CLR 反映來取得屬性的值。 實 ICustomTypeDescriptor 作或已註冊 TypeDescriptionProvider 的物件也適用于系結引擎。
如需如何實作可作為系結來源的類別的詳細資訊,請參閱 本文稍後在物件 上實作系結來源。
動態物件
您可以系結至實作 介面之物件的 IDynamicMetaObjectProvider 可用屬性和索引子。 如果您可以在程式碼中存取某個成員,就可以繫結至該成員。 例如,若動態物件可讓您在程式碼中透過
SomeObject.AProperty
存取某個成員,您就可以將繫結路徑設定為AProperty
,以繫結至該成員。ADO.NET 物件
您可以系結至 ADO.NET 物件,例如 DataTable 。 ADO.NET DataView 會實作 IBindingList 介面,以提供系結引擎接聽的變更通知。
XML 物件
您可以在 、 或 XmlElement 上 XmlNode 系結並執行
XPath
查詢。 XmlDocument 存取標記中系結來源之 XML 資料的便利方式是使用 XmlDataProvider 物件。 如需詳細資訊,請參閱 使用 XMLDataProvider 和 XPath 查詢系結至 XML 資料 (.NET Framework)。您也可以系結至 XElement 或 XDocument ,或使用 LINQ to XML 系結至在這些類型物件上執行的查詢結果。 使用 LINQ to XML 存取標記中系結來源之 XML 資料的便利方式是使用 ObjectDataProvider 物件。 如需詳細資訊,請參閱 系結至 XDocument、XElement 或 LINQ for XML 查詢結果 (.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}
。 這很有用的案例包括系結至類型為字串的物件、系結至具有您感興趣的多個屬性的物件,或系結至集合物件。 如需系結至整個集合物件的範例,請參閱 如何搭配階層式資料使用 Master-Detail Pattern (.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 會以完全信任的安全性執行。 所有資料系結都會以與執行應用程式的使用者相同的存取權執行。