第 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
,而 是衍生來源VisualElement
的Element
父類別。 這是 和 Page
View
的父類別,這是 的父類別:Layout
查看 BindableObject 和 BindableProperty
在衍生自 BindableObject
許多 CLR 屬性的類別中,據說是「由」可系結屬性所支援。 例如,類別 Text
的 Label
屬性是CLR屬性,但類別 Label
也會定義名為 TextProperty
類型的 BindableProperty
公用靜態唯讀欄位。
應用程式可以正常設定或取得 Text
的屬性,或者應用程式可以藉由呼叫 SetValue
以 BindableObject
Label.TextProperty
自變數定義的 方法來設定 Text
Label
。 同樣地,應用程式可以使用 自變數再次Label.TextProperty
呼叫 GetValue
方法,以取得 屬性的值Text
。 此屬性是由 PropertySettings 範例所示範。
事實上,Text
CLR 屬性會使用 與 Label.TextProperty
靜態屬性所定義的 BindableObject
和 GetValue
方法完全實SetValue
作。
BindableObject
並提供 BindableProperty
下列項目的支援:
- 提供屬性預設值
- 儲存其目前值
- 提供驗證屬性值的機制
- 維護單一類別中相關屬性之間的一致性
- 回應屬性變更
- 當屬性即將變更或已變更時觸發通知
- 支援數據系結
- 支援樣式
- 支援動態資源
每當可系結屬性所支援的屬性變更時, BindableObject
就會引發 PropertyChanged
事件,識別已變更的屬性。 當屬性設定為相同的值時,不會引發此事件。
某些屬性不是由可系結的屬性所支援,有些 Xamarin.Forms 類別則 Span
不會衍生自 BindableObject
。 只有衍生自 BindableObject
的類別可以支援可繫結的屬性,因為 BindableObject
會 SetValue
定義 和 GetValue
方法。
因為 Span
不是因為不衍生自 BindableObject
,因此沒有任何屬性 ,例如 Text
, 都由可繫結的屬性所支援。 這就是為什麼 DynamicResource
的 Text
屬性Span
設定會在上一章的 DynamicVsStatic 範例中引發例外狀況的原因。 DynamicVsStaticCode 範例示範如何使用 所Element
定義的 方法來在程式代碼SetDynamicResource
中設定動態資源。 第一個自變數是 類型的 BindableProperty
物件。
同樣地, SetBinding
所 BindableObject
定義的 方法具有 類型 BindableProperty
的第一個自變數。
定義可系結屬性
您可以使用靜態方法來定義自己的可繫結屬性,以建立類型的BindableProperty
靜態BindableProperty.Create
只讀字段。
這會在 Book.Toolkit 連結庫中的 類別Xamarin.Forms中AltLabel
示範。 類別衍生自 Label
,可讓您以點為單位指定字型大小。 它會在PointSizedText範例中示範。
需要方法的 BindableProperty.Create
四個自變數:
propertyName
:屬性的文字名稱(與 CLR 屬性名稱相同)returnType
:CLR 屬性的類型declaringType
:宣告 屬性之類別的類型defaultValue
:屬性的預設值
因為 defaultValue
的類型是 object
,編譯程式必須能夠判斷預設值的類型。 例如,如果 returnType
是 double
, defaultValue
則 應該設定為類似 0.0 而非只有 0,或者類型不符會在運行時間觸發例外狀況。
可系結屬性也非常常見,包括:
propertyChanged
:屬性變更值時所呼叫的靜態方法。 第一個自變數是 類別的實例,其屬性已變更。
的其他自變數 BindableProperty.Create
不一樣常見:
defaultBindingMode
:與數據系結搭配使用 (如第 16 章所述 。資料系結)validateValue
:要檢查有效值的回呼propertyChanging
:回呼,指出屬性何時即將變更coerceValue
:將設定值強制設為另一個值的回呼defaultValueCreate
:回呼,用來建立無法在 類別實例之間共用的預設值(例如集合)
唯讀可系結屬性
可系結屬性可以是唯讀的。 建立唯讀可系結屬性需要呼叫靜態方法 BindableProperty.CreateReadOnly
,才能定義類型的 BindablePropertyKey
私用靜態只讀字段。
然後,將 CLR 屬性 set
accesor private
定義為 ,以使用 BindablePropertyKey
物件呼叫SetValue
多載。 這可防止在 類別外部設定 屬性。
這會在 CountedLabel
BaskervillesCount範例中使用的類別中示範。