XAML Compiled Bindings (výkonnostní tip pro Xamarin.Forms)

Data binding je excelentní vlastnost návrhového vzoru MVVM a umožňuje oddělení view a view modelů. Protože jsou Xamarin.Forms MVVM-first framework, použití data bindingu je jasnou volbou. Protože však data binding používá reflexi, může mít negativní dopad na výkon celé aplikace. Naštěstí Xamarin.Forms podporují Compiled Bindings, které jsou podobné syntaxi x:Bind v UWP a umožňují vyhodnocení všech bindingů při kompilaci aplikace. Aplikace pak za běhu může používate strongly-typed reference, které jsou výrazně efektivnejší.

Proč zvolit compiled bindings

“Stojí mi to za to?” To je první otázka kterou se můžete ptát. A odpověď je jednoznačné “Ano!”. Compiled bindings mají oproti těm klasickým následující výhody:

  • Výkon – pro OneTime binding je vyhodnocení přibližně 20krát rychlejší v případě použití compiled bindings, s ostatními módy je to stále až 8krát lepší. Především u rozsáhlejších XAML stránek má compiled binding skutečně citelně navrch.
  • Jistota již při komplaci – nastavování data bindingů je náchylné k chybám, již malý překlep znamená nefunkční binding a ještě hůře se pak chyba dohledává. S compiled bindings se všechny problémy ukáží již při kompilaci aplikace, takže se můžete spolehnout, že vaše bindingy ukazují (alespoň referenčně) na správná místa. Compiled bindings také pomáhají odhalit “zapomenuté”  bindingy, které byly dříve nastaveny, ale již se nepoužívají či na ně napojené vlastnosti byly odstraněny z View Modelu.

Jak na to

Pro zprovoznění compiled bindings potřebujete obecně:

  1. Povolit kompilaci XAMLu pomocí atributů
  2. Nastavit x:DataType to appropriate type on an element in your XAML visual tree

Pokud jste projekt vytvořili pomocí novějších Xamarin.Forms šablon ve Visual Studiu, pravděpodobně si první krok můžete zaškrtnout jako splněný – kompilace XAMLu je povolená již ve výchozím projektu. V opačném případě lze toto nastavení povolit buď na úrovni assembly nebo na úrovni stránky.

Pokud chcete kompilaci automaticky povolit pro všechny XAML stránky a view v projektu (což je doporučeno), můžete to udělat takto:

Tento atribut můžete umístit do kořenového namespace vašeho projektu. Vhodným místem pro to je  App.xaml.cs.

Alternativně lze kompilaci povolit na úrovni stránky:

Druhý krok je povolení compiled bindings přidáním atributu x:DataType na VisualElement v  XAMLu. Doporučuje se nastavit tento atribut na stejné úrovni v hierarchii, kde je nastaven BindingContext. Musíme deklarovat odpovídající XML namespace a použít jej v atributu x:DataType.

Pro příklad předpokládejme, že se naše aplikace jmenuje MyAwesomeApp a chceme vytvořit compiled binding pro jednoduchou třídu MyAwesomeApp.ViewModels.HomeViewModel:

V HomePage.xaml přidáme deklaraci xmlns:viewModels s odpovídajícím namespace do kořenového elementu <ContentPage> a nastavíme na stejné úrovni i x:DataType:

Compiled bindings jsou nyní pro vaši stránku. To si můžete ověřit nahrazením Greeting v bindingu názvem nějaké neexistující vlastnosti a sestavením projektu. “Pozdraví” vás následující chyba:

WrongPropertyName
S comiled bindings vám neunikne žádná chyba

Použití compiled bindings s DataTemplate

Další perfektní místo pro využití compiled bindings jsou seznamy, kde se každá optimalizace výkonu vyplatí N-násobně. Naštěstí nás ani zde Xamarin.Forms nenechá zkrátka – atribut x:DataType můžete aplikovat i na DataTemplate:

Přepnutí zpět na klasický data binding

Even though compiled bindings are mature enough for production, you might still encounter some issues. In such cases, you can also selectively disable compiled bindings at any level of the XAML hierarch by setting the x:DataType attribute back to null:

Zdrojový kód

Ukázkový zdrojový kód k tomuto článku je k dispozici na mém GitHubu.SampleApp

Shrnutí

Compiled bindings přináší dvě významné výhody oproti klasickému data bindingu v Xamarin.Forms – významné zlepšení výkonu a kontrolu při kompilaci. Rozhodně zvýší vaši vývojářskou produktivitu a to se vždy vyplatí.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.