共用方式為


第 11 章的摘要。 可系結基礎結構

注意

這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。

每個 C# 程式設計人員都熟悉 C# 屬性。 屬性包含 set 存取子和/或 get 存取子。 它們通常稱為 Common Language Runtime 的 CLR 屬性

Xamarin.Forms定義稱為 類別所BindableProperty封裝且類別所BindableObject支援的可系結屬性的增強屬性定義。 這些類別是相關的,但相當相異: BindableProperty 用來定義屬性本身; BindableObject 就像是定義可系結屬性的類別的基類一樣 object

類別 Xamarin.Forms 階層

ClassHierarchy 範例會使用反映來顯示 的Xamarin.Forms類別階層,並示範在此階層中扮演BindableObject的重要角色。 BindableObject衍生自 Object ,而 是衍生來源VisualElementElement父類別。 這是 和 Page View的父類別,這是 的父類別:Layout

類別階層共用的三重螢幕快照

查看 BindableObject 和 BindableProperty

在衍生自 BindableObject 許多 CLR 屬性的類別中,據說是「由」可系結屬性所支援。 例如,類別 TextLabel 屬性是CLR屬性,但類別 Label 也會定義名為 TextProperty 類型的 BindableProperty公用靜態唯讀欄位。

應用程式可以正常設定或取得 Text 的屬性,或者應用程式可以藉由呼叫 SetValueBindableObject Label.TextProperty 自變數定義的 方法來設定 Text Label 。 同樣地,應用程式可以使用 自變數再次Label.TextProperty呼叫 GetValue 方法,以取得 屬性的值Text。 此屬性是由 PropertySettings 範例所示範。

事實上,TextCLR 屬性會使用 與 Label.TextProperty 靜態屬性所定義的 BindableObjectGetValue 方法完全實SetValue作。

BindableObject 並提供 BindableProperty 下列項目的支援:

  • 提供屬性預設值
  • 儲存其目前值
  • 提供驗證屬性值的機制
  • 維護單一類別中相關屬性之間的一致性
  • 回應屬性變更
  • 當屬性即將變更或已變更時觸發通知
  • 支援數據系結
  • 支援樣式
  • 支援動態資源

每當可系結屬性所支援的屬性變更時, BindableObject 就會引發 PropertyChanged 事件,識別已變更的屬性。 當屬性設定為相同的值時,不會引發此事件。

某些屬性不是由可系結的屬性所支援,有些 Xamarin.Forms 類別則 Span 不會衍生自 BindableObject。 只有衍生自 BindableObject 的類別可以支援可繫結的屬性,因為 BindableObjectSetValue 定義 和 GetValue 方法。

因為 Span 不是因為不衍生自 BindableObject,因此沒有任何屬性 ,例如 Text , 都由可繫結的屬性所支援。 這就是為什麼 DynamicResourceText 屬性Span設定會在上一章的 DynamicVsStatic 範例中引發例外狀況的原因。 DynamicVsStaticCode 範例示範如何使用 所Element定義的 方法來在程式代碼SetDynamicResource中設定動態資源。 第一個自變數是 類型的 BindableProperty物件。

同樣地, SetBindingBindableObject 定義的 方法具有 類型 BindableProperty的第一個自變數。

定義可系結屬性

您可以使用靜態方法來定義自己的可繫結屬性,以建立類型的BindableProperty靜態BindableProperty.Create只讀字段。

這會在 Book.Toolkit 連結庫中的 類別Xamarin.Forms中AltLabel示範。 類別衍生自 Label ,可讓您以點為單位指定字型大小。 它會在PointSizedText範例中示範。

需要方法的 BindableProperty.Create 四個自變數:

  • propertyName:屬性的文字名稱(與 CLR 屬性名稱相同)
  • returnType:CLR 屬性的類型
  • declaringType:宣告 屬性之類別的類型
  • defaultValue:屬性的預設值

因為 defaultValue 的類型是 object,編譯程式必須能夠判斷預設值的類型。 例如,如果 returnTypedoubledefaultValue 則 應該設定為類似 0.0 而非只有 0,或者類型不符會在運行時間觸發例外狀況。

可系結屬性也非常常見,包括:

  • propertyChanged:屬性變更值時所呼叫的靜態方法。 第一個自變數是 類別的實例,其屬性已變更。

的其他自變數 BindableProperty.Create 不一樣常見:

  • defaultBindingMode:與數據系結搭配使用 (如第 16 章所述 。資料系結
  • validateValue:要檢查有效值的回呼
  • propertyChanging:回呼,指出屬性何時即將變更
  • coerceValue:將設定值強制設為另一個值的回呼
  • defaultValueCreate:回呼,用來建立無法在 類別實例之間共用的預設值(例如集合)

唯讀可系結屬性

可系結屬性可以是唯讀的。 建立唯讀可系結屬性需要呼叫靜態方法 BindableProperty.CreateReadOnly ,才能定義類型的 BindablePropertyKey私用靜態只讀字段。

然後,將 CLR 屬性 set accesor private 定義為 ,以使用 BindablePropertyKey 物件呼叫SetValue多載。 這可防止在 類別外部設定 屬性。

這會在 CountedLabel BaskervillesCount範例中使用的類別中示範。