共用方式為


繫結來源概觀

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

繫結來源類型

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

繫結來源 描述
通用語言執行平台 (CLR) 物件 您可以繫結至任何通用語言執行平台 (CLR) 物件的公用屬性、子屬性以及索引子。 繫結引擎會使用 CLR 反映來取得這些屬性的值。 或者,實作 ICustomTypeDescriptor 或具有已註冊 TypeDescriptionProvider 的物件也適用於繫結引擎。

如需如何實作可做為繫結來源之類別的詳細資訊,請參閱本主題稍後的為繫結來源實作類別
動態物件 您可以繫結至實作 IDynamicMetaObjectProvider 介面之物件的可用屬性和索引器。 如果您可以在程式碼中存取某個成員,就可以繫結至該成員。 例如,若動態物件可讓您在程式碼中透過 someObject.AProperty 存取某個成員,您就可以將繫結路徑設定為 AProperty,以繫結至該成員。
ADO.NET 物件 您可以繫結至 ADO.NET 物件,例如 DataTable。 ADO.NET DataView 會實作 IBindingList 介面,以提供繫結引擎所接聽的變更通知。
XML 物件 您可以在 XmlNodeXmlDocumentXmlElement 上繫結並執行 XPath 查詢。 有一種簡便的方法可以存取在標記中作為繫結來源的 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

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

您可以使用整個物件做為繫結來源。 您可以使用 SourceDataContext 屬性來指定繫結來源,然後提供空白的繫結宣告:{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

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

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

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

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

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

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

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

另請參閱