注意
這本書於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 範例所示範。
事實上,TextCLR 屬性會使用 與 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範例中使用的類別中示範。
