Shrnutí kapitoly 11. Infrastruktura s možností vazby

Download Sample Stažení ukázky

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:

Triple screenshot of class hierarchy sharing

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 vlastnosti Nastavení.

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 BindableObjectz vlastností , jako Text je například , je zajištěna vazebnou vlastností. To je důvod, proč DynamicResource nastavení vlastnosti TextSpan 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 BindablePropertypole 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 CLR
  • declaringType: typ třídy deklarující vlastnost
  • defaultValue: 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 doubledefaultValue 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 hodnotu
  • defaultValueCreate: 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.