繫結來源概觀

在資料繫結中,繫結來源物件是指您取得資料的來源物件。 本主題討論可以當做繫結來源的物件類型。

繫結來源類型

Windows Presentation Foundation (WPF) 資料系結支援下列系結來源類型:

繫結來源 描述
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 物件 您可以在 、 或 XmlElementXmlNode 系結並執行 XPath 查詢。 XmlDocument 存取標記中系結來源之 XML 資料的便利方式是使用 XmlDataProvider 物件。 如需詳細資訊,請參閱使用 XMLDataProvider 和 XPath 查詢繫結至 XML 資料

您也可以系結至 XElementXDocument ,或使用 LINQ to XML 系結至在這些類型物件上執行的查詢結果。 使用 LINQ to XML 存取標記中系結來源之 XML 資料的便利方式是使用 ObjectDataProvider 物件。 如需詳細資訊,請參閱繫結至 XML 查詢結果的 XDocument、XElement 或 LINQ
DependencyObject 物件 您可以系結至任何 DependencyObject 的相依性屬性。 如需範例,請參閱繫結兩個控制項的屬性

為繫結來源實作類別

您可以建立自己的繫結來源。 本節討論在實作類別以做為繫結來源時必須知道的事。

提供變更通知

如果您使用 OneWayTwoWay 系結(因為您希望 UI 在系結來源屬性動態變更時更新),您必須實作適當的屬性變更通知機制。 建議的機制是讓 CLR 或動態類別實作 INotifyPropertyChanged 介面。 如需詳細資訊,請參閱實作屬性變更通知

如果您建立未實 INotifyPropertyChanged 作 的 CLR 物件,則必須安排自己的通知系統,以確保系結中使用的資料保持在最新狀態。 您可以針對想要通知變更的每個屬性支援 PropertyChanged 模式,以提供變更通知。 若要支援這個模式,請定義每個屬性的 PropertyNameChanged 事件,其中 PropertyName 是屬性的名稱。 您可在每次屬性變更時,引發這個事件。

如果繫結來源實作其中一種通知機制,系統就會自動更新目標。 如果因為任何原因,系結來源未提供適當的屬性變更通知,您可以選擇使用 UpdateTarget 方法來明確更新目標屬性。

其他特性

下列清單提供必須注意的其他重點:

  • 如果您想要在 XAML 中建立物件,類別必須具有無參數建構函式。 在某些 .NET 語言中,例如 C#,可能會為您建立無參數建構函式。

  • 要當做繫結之繫結來源屬性的屬性必須是類別的公用屬性。 明確定義的介面屬性不能做為繫結之用,而沒有基底實作的受保護、私用、內部或虛擬屬性同樣也不能做為繫結之用。

  • 您不能繫結至公用欄位。

  • 在類別中宣告的屬性,其型別就是傳遞至繫結的型別。 不過,繫結最終使用的型別需視繫結目標屬性 (而非繫結來源屬性) 的型別而定。 如果型別不同,您可能需要撰寫轉換器來處理自訂屬性一開始傳遞到繫結的方式。 如需詳細資訊,請參閱IValueConverter

使用整個物件做為繫結來源

您可以使用整個物件做為繫結來源。 您可以使用 或 DataContext 屬性來指定系結來源 Source ,然後提供空白系結宣告: {Binding} 。 可以使用這種方法的案例包括繫結到屬於字串型別的物件、繫結到內含您感興趣之多個屬性的物件,或是繫結到集合物件。 如需繫結到整個集合物件的範例,請參閱使用含階層式資料的主從式模式

請注意,您可能必須套用自訂邏輯,如此資料對於繫結目標屬性來說才有意義。 自訂邏輯的格式可能是自訂轉換器(如果預設類型轉換不存在)或 DataTemplate 。 如需轉換器的詳細資訊,請參閱資料繫結概觀的<資料轉換>一節。 如需資料範本的詳細資訊,請參閱 資料範本化概觀

使用集合物件做為繫結來源

您想當做繫結來源的物件通常會是自訂物件的集合。 每個物件都會當做重複繫結的其中一個執行個體的來源。 例如,您可能有一個由 CustomerOrder 物件組成的 CustomerOrders 集合,而您的應用程式會逐一查看這個集合來判斷訂單數量,以及各筆訂單所包含的資料。

您可以列舉實作 IEnumerable 介面的任何集合。 不過,若要設定動態繫結,讓集合中的插入或刪除作業自動更新 UI,則集合必須實作 INotifyCollectionChanged 介面。 這個介面會公開每次基礎集合變更時必須引發的事件。

類別 ObservableCollection<T> 是公開 介面之資料收集 INotifyCollectionChanged 的內建實作。 集合中的個別資料物件都必須滿足前幾個章節中描述的需求。 如需範例,請參閱建立和繫結至 ObservableCollection。 實作您自己的集合之前,請考慮使用 ObservableCollection<T> 或其中一個現有的集合類別,例如 List<T>Collection<T>BindingList<T> 等。

WPF 絕不會直接繫結至集合。 如果您指定集合做為繫結來源,WPF 實際上會繫結至集合的預設檢視。 如需預設檢視的詳細資訊,請參閱資料繫結概觀

如果您有進階案例,而且想要實作自己的集合,請考慮使用 IList 介面。 IList 提供可由索引個別存取的物件非泛型集合,可改善效能。

資料繫結的使用權限需求

進行資料繫結時,您必須考慮應用程式的信任層級。 下表摘要說明在以完全信任或部分信任執行的應用程式中,可以當做繫結目標的屬性型別:

屬性類型

(所有存取修飾詞)
動態物件屬性 動態物件屬性 CLR 屬性 CLR 屬性 相依性屬性 相依性屬性
信任層級 完全信任 部分信任 完全信任 部分信任 完全信任 部分信任
公用類別 Yes Yes Yes Yes Yes Yes
非公用類別 .是 Yes

這個表格說明資料繫結中使用權限需求的下列相關重點:

  • 對於 CLR 屬性,只要系結引擎能夠使用反映來存取系結來源屬性,資料系結就可以運作。 否則,繫結引擎將會發出找不到屬性的警告,並使用後援值或預設值 (如果有的話)。

  • 您可以繫結至在編譯階段或執行階段定義之動態物件上的屬性。

  • 您永遠都可以繫結至相依性屬性。

XML 系結的許可權需求類似。 在部分信任沙箱中,當沙箱沒有存取指定資料的許可權時, XmlDataProvider 就會失敗。

具有匿名型別的物件為內部物件。 只有在完全信任狀況下執行時,您才能繫結至匿名型別的屬性。 如需匿名型別的詳細資訊,請參閱匿名型別 (C# 程式設計手冊)匿名型別 (Visual Basic) (Visual Basic)。

如需部分信任安全性的詳細資訊,請參閱 WPF 部分信任安全性

另請參閱