共用方式為


什麼是系結來源? (WPF .NET)

在資料繫結中,繫結來源物件是指您取得資料的來源物件。 本文討論可作為繫結來源的物件類型,例如 .NET CLR 物件、XML 和 DependencyObject 物件。

繫結來源類型

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

在您的物件上實作繫結來源

您的 CLR 物件可以變成繫結來源。 實作類別作為繫結來源時,需要注意一些事項。

提供變更通知

如果您使用 OneWayTwoWay 繫結,請實作適當的「屬性已變更」通知機制。 建議的機制是讓 CLR 或動態類別實作 INotifyPropertyChanged 介面。 如需詳細資訊,請參閱如何:實作屬性變更通知 (.NET Framework)

有兩種方式可以通知訂閱者屬性變更:

  • 實作 INotifyPropertyChanged 介面。

    這是建議的通知機制。 INotifyPropertyChanged 提供繫結系統所遵守的 PropertyChanged 事件。 藉由引發此事件,並提供已變更屬性的名稱,便會通知繫結目標此一變更。

  • 實作 PropertyChanged 模式。

    需要向繫結目標通知變更的每個屬性,都有對應的 PropertyNameChanged 事件,其中 PropertyName 是屬性的名稱。 您可在每次屬性變更時,引發這個事件。

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

其他特性

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

  • 作為繫結來源的資料物件可以在 XAML 中宣告為資源,前提是其具有無參數建構函式。 否則,您必須在程式碼中建立資料物件,並將其直接指派給 XAML 物件樹狀結構的資料內容,或作為繫結的繫結來源。

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

  • 您無法繫結至公用欄位。

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

整個物件作為繫結來源

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

您可能必須套用自訂邏輯,如此資料對於繫結的目標屬性來說才有意義。 自訂邏輯的格式可以是自訂轉換器或 DataTemplate。 如需轉換器的詳細資訊,請參閱資料轉換。 如需資料範本的詳細資訊,請參閱資料範本化概觀 (.NET Framework)

集合物件作為繫結來源

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

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

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

當您指定集合作為繫結來源時,WPF 不會直接繫結至該集合。 取而代之的是,WPF 實際上會繫結至該集合的預設檢視。 如需預設檢視的詳細資訊,請參閱使用預設檢視

如果您在進階案例中要實作自己的集合,請考慮使用 IList 介面。 此介面提供非泛型的物件集合,其中每個物件都可由索引個別存取,而這樣可以改善效能。

資料繫結的使用權限需求

不同於 .NET Framework,.NET 會以完全信任的安全性執行。 所有資料繫結都會以與執行應用程式的使用者相同的存取權執行。

另請參閱