繫結來源概觀
在資料繫結中,繫結來源物件是指您取得資料的來源物件。 本主題討論可以當做繫結來源的物件類型。
繫結來源類型
Windows Presentation Foundation (WPF) 資料繫結支援下列繫結來源類型:
繫結來源 | 描述 |
---|---|
通用語言執行平台 (CLR) 物件 | 您可以繫結至任何通用語言執行平台 (CLR) 物件的公用屬性、子屬性以及索引子。 繫結引擎會使用 CLR 反映來取得這些屬性的值。 或者,實作 ICustomTypeDescriptor 或具有已註冊 TypeDescriptionProvider 的物件也適用於繫結引擎。 如需如何實作可做為繫結來源之類別的詳細資訊,請參閱本主題稍後的為繫結來源實作類別。 |
動態物件 | 您可以繫結至實作 IDynamicMetaObjectProvider 介面之物件的可用屬性和索引器。 如果您可以在程式碼中存取某個成員,就可以繫結至該成員。 例如,若動態物件可讓您在程式碼中透過 someObject.AProperty 存取某個成員,您就可以將繫結路徑設定為 AProperty ,以繫結至該成員。 |
ADO.NET 物件 | 您可以繫結至 ADO.NET 物件,例如 DataTable。 ADO.NET DataView 會實作 IBindingList 介面,以提供繫結引擎所接聽的變更通知。 |
XML 物件 | 您可以在 XmlNode、XmlDocument 或 XmlElement 上繫結並執行 XPath 查詢。 有一種簡便的方法可以存取在標記中作為繫結來源的 XML 資料,就是使用 XmlDataProvider 物件。 如需詳細資訊,請參閱使用 XMLDataProvider 和 XPath 查詢繫結至 XML 資料。您也可以繫結至 XElement 或 XDocument,或繫結至在這些類型的物件上使用 LINQ to XML 執行查詢的結果。 有一種簡便的方法可以使用 LINQ to XML 存取在標記中作為繫結來源的 XML 資料,就是使用 ObjectDataProvider 物件。 如需詳細資訊,請參閱繫結至 XML 查詢結果的 XDocument、XElement 或 LINQ。 |
DependencyObject 物件 | 您可以繫結至任何 DependencyObject 的相依性屬性。 如需範例,請參閱繫結兩個控制項的屬性。 |
為繫結來源實作類別
您可以建立自己的繫結來源。 本節討論在實作類別以做為繫結來源時必須知道的事。
提供變更通知
如果您使用 OneWay 或 TwoWay 繫結 (因為您希望 UI 在繫結來源屬性動態變更時更新),則必須實作適當的屬性變更通知機制。 建議的機制是讓 CLR 或動態類別實作 INotifyPropertyChanged 介面。 如需詳細資訊,請參閱實作屬性變更通知。
如果您建立未實作 INotifyPropertyChanged 的 CLR 物件,則您必須安排自己的通知系統,以確保繫結中使用的都是最新的資料。 您可以針對想要通知變更的每個屬性支援 PropertyChanged
模式,以提供變更通知。 若要支援這個模式,請定義每個屬性的 PropertyNameChanged 事件,其中 PropertyName 是屬性的名稱。 您可在每次屬性變更時,引發這個事件。
如果繫結來源實作其中一種通知機制,系統就會自動更新目標。 如果繫結來源因故未提供適當的屬性變更通知,您可以選擇使用 UpdateTarget 方法來明確更新目標屬性。
其他特性
下列清單提供必須注意的其他重點:
如果您想要在 XAML 中建立物件,類別必須具有無參數建構函式。 在某些 .NET 語言中,例如 C#,可能會為您建立無參數建構函式。
要當做繫結之繫結來源屬性的屬性必須是類別的公用屬性。 明確定義的介面屬性不能做為繫結之用,而沒有基底實作的受保護、私用、內部或虛擬屬性同樣也不能做為繫結之用。
您不能繫結至公用欄位。
在類別中宣告的屬性,其型別就是傳遞至繫結的型別。 不過,繫結最終使用的型別需視繫結目標屬性 (而非繫結來源屬性) 的型別而定。 如果型別不同,您可能需要撰寫轉換器來處理自訂屬性一開始傳遞到繫結的方式。 如需詳細資訊,請參閱IValueConverter。
使用整個物件做為繫結來源
您可以使用整個物件做為繫結來源。 您可以使用 Source 或 DataContext 屬性來指定繫結來源,然後提供空白的繫結宣告:{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 | 無 | Yes | 無 | Yes | Yes |
這個表格說明資料繫結中使用權限需求的下列相關重點:
對於 CLR 屬性,只要繫結引擎能夠使用反映來存取繫結來源屬性,資料繫結就有作用。 否則,繫結引擎將會發出找不到屬性的警告,並使用後援值或預設值 (如果有的話)。
您可以繫結至在編譯階段或執行階段定義之動態物件上的屬性。
您永遠都可以繫結至相依性屬性。
XML 繫結也有類似的使用權限需求。 在部分信任沙箱中,當沙箱沒有存取指定資料的權限時,XmlDataProvider 就會失敗。
具有匿名型別的物件為內部物件。 只有在完全信任狀況下執行時,您才能繫結至匿名型別的屬性。 如需匿名型別的詳細資訊,請參閱匿名型別 (C# 程式設計手冊) 或匿名型別 (Visual Basic) (Visual Basic)。
如需部分信任安全性的詳細資訊,請參閱 WPF 部分信任安全性。