Shrnutí kapitoly 11. Infrastruktura s možností vazby
Poznámka:
Tato kniha byla publikována na jaře roku 2016 a od té doby nebyla aktualizována. Existuje mnoho v knize, která zůstává cenná, ale některé materiály jsou zastaralé a některá témata už nejsou zcela správná nebo úplná.
Každý programátor jazyka C# má zkušenosti s vlastnostmi jazyka C#. Vlastnosti obsahují přístupové objekty sady nebo přístupové objekty get . Často se označují jako vlastnosti CLR pro common language runtime.
Xamarin.Forms definuje rozšířenou definici vlastnosti označovanou jako bindable vlastnost zapouzdřená BindableProperty
třídou a podporovanou BindableObject
třídou. Tyto třídy jsou související, ale zcela odlišné: Slouží BindableProperty
k definování samotné vlastnosti; BindableObject
je jako object
v tom, že je základní třídou pro třídy, které definují bindable vlastnosti.
Hierarchie Xamarin.Forms tříd
Ukázka ClassHierarchy používá reflexi k zobrazení hierarchie Xamarin.Forms tříd a předvedení zásadní role, kterou BindableObject
hraje v této hierarchii. BindableObject
je odvozena od Object
a je nadřazenou třídou, ze Element
které VisualElement
je odvozena. Toto je nadřazená třída Page
a View
, která je nadřazenou třídou pro Layout
:
Náhled na BindableObject a BindableProperty
Ve třídách odvozených z BindableObject
mnoha vlastností CLR se říká, že jsou "zajištěny" bindable vlastnosti. Například Text
vlastnost Label
třídy je CLR vlastnost, ale Label
třída také definuje veřejné statické pole jen pro čtení s názvem TextProperty
typu BindableProperty
.
Aplikace může nastavit nebo získat Text
vlastnost Label
normálně, nebo aplikace může nastavit Text
voláním SetValue
metody definované BindableObject
argumentem Label.TextProperty
. Podobně aplikace může získat hodnotu Text
vlastnosti voláním GetValue
metody znovu s argumentem Label.TextProperty
. To ukazuje ukázka PropertySettings.
Text
ClR vlastnost je skutečně zcela implementována pomocí SetValue
a GetValue
metod definovaných BindableObject
ve spojení se Label.TextProperty
statickou vlastností.
BindableObject
a BindableProperty
poskytovat podporu pro:
- Poskytnutí výchozích hodnot vlastností
- Ukládání jejich aktuálních hodnot
- Poskytování mechanismů pro ověřování hodnot vlastností
- Zachování konzistence mezi souvisejícími vlastnostmi v jedné třídě
- Reakce na změny vlastností
- Aktivace oznámení při změně nebo změně vlastnosti
- Podpora datové vazby
- Podpůrné styly
- Podpora dynamických prostředků
Pokaždé, když se změní vlastnost, která je zajištěna vazebnou vlastností, BindableObject
aktivuje PropertyChanged
událost identifikující změněnou vlastnost. Tato událost se neaktivuje, pokud je vlastnost nastavena na stejnou hodnotu.
Některé vlastnosti nejsou zajištěny vlastnostmi vázání a některé Xamarin.Forms třídy , například Span
– nejsou odvozeny z BindableObject
. Pouze třída, která je odvozena, BindableObject
může podporovat bindable vlastnosti, protože BindableObject
definuje SetValue
a GetValue
metody.
Vzhledem k tomu Span
, že neodvozuje žádnou BindableObject
z vlastností , jako Text
je například , je zajištěna vazebnou vlastností. To je důvod, proč DynamicResource
nastavení vlastnosti Text
Span
vyvolá výjimku v DynamicVsStatic v ukázce v předchozí kapitole. Ukázka DynamicVsStaticCode ukazuje, jak nastavit dynamické prostředky v kódu pomocí SetDynamicResource
metody definované Element
. První argument je objekt typu BindableProperty
.
SetBinding
Podobně má metoda definovaná BindableObject
prvním argumentem typu BindableProperty
.
Definování vlastností s možností vytvoření vazby
Pomocí statické BindableProperty.Create
metody můžete definovat vlastní vlastnosti bindable k vytvoření statického BindableProperty
pole typu jen pro čtení .
To je demonstrováno ve AltLabel
třídě v knihovně Xamarin.FormsBook.Toolkit. Třída je odvozena z Label
a umožňuje určit velikost písma v bodech. Ukazuje se v ukázce PointSizedText .
Vyžadují se čtyři argumenty BindableProperty.Create
metody:
propertyName
: textový název vlastnosti (stejný jako název vlastnosti CLR)returnType
: typ vlastnosti CLRdeclaringType
: typ třídy deklarující vlastnostdefaultValue
: výchozí hodnota vlastnosti
Vzhledem k tomu defaultValue
, že je typ object
, kompilátor musí být schopen určit typ výchozí hodnoty. Pokud je double
defaultValue
například nastavena returnType
hodnota 0,0, měla by být nastavena na hodnotu 0,0, nikoli pouze 0, nebo neshoda typu aktivuje výjimku za běhu.
Je také velmi běžné, že vlastnost s možností vazby zahrnuje:
propertyChanged
: Statická metoda volána při změně hodnoty vlastnosti. Prvním argumentem je instance třídy, jejíž vlastnost byla změněna.
Ostatní argumenty, které BindableProperty.Create
nemají být běžné:
defaultBindingMode
: používá se v souvislosti s datovou vazbou (jak je popsáno v kapitole 16. Datová vazba)validateValue
: zpětné volání, které zkontroluje platnou hodnotu.propertyChanging
: zpětné volání označující, kdy se vlastnost chystá změnit.coerceValue
: zpětné volání pro převod nastavené hodnoty na jinou hodnotudefaultValueCreate
: zpětné volání pro vytvoření výchozí hodnoty, kterou nelze sdílet mezi instancemi třídy (například kolekcí).
Vlastnost bindable jen pro čtení
Vlastnost s možností vázání může být jen pro čtení. Vytvoření vlastnosti bindable jen pro čtení vyžaduje volání statické metody BindableProperty.CreateReadOnly
definovat privátní statické pole jen pro čtení typu BindablePropertyKey
.
Pak definujte vlastnost set
CLR, která private
má volat SetValue
přetížení objektu BindablePropertyKey
. Tím zabráníte nastavení vlastnosti mimo třídu.
To je demonstrováno ve CountedLabel
třídě použité v BaskervillesCount vzorku.