系結來源概觀 (WPF .NET)

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

系結來源類型

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

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

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

提供變更通知

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

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

  1. 實作 INotifyPropertyChanged 介面。

    這是通知的建議機制。 INotifyPropertyChangedPropertyChanged 提供系結系統所遵循的事件。 藉由引發此事件,並提供已變更的屬性名稱,您將通知系結目標變更。

  2. 實作 PropertyChanged 模式。

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

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

其他特性

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

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

  • 您做為系結來源屬性的屬性必須是 類別的公用屬性。 明確定義的介面屬性無法針對系結目的存取,也無法保護、私人、內部或沒有基底實作的虛擬屬性。

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

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

整個物件做為系結來源

您可以使用整個物件做為繫結來源。 使用 SourceDataContext 屬性指定系結來源,然後提供空白系結宣告: {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 會以完全信任的安全性執行。 所有資料系結都會以與執行應用程式的使用者相同的存取權執行。

另請參閱