Jak nastavit výchozí mód pro x:Bind v UWP

Skvělou novinkou v Universal Windows Platform XAMLu oproti WPF je {x:Bind}. Pomocí něho se data-binding vhodnocuje v čase kompilace, namísto nutnosti provádět reflexi, což je nejen překlepu-vdornější, ale zároveň zvyšuje výkon za běhu. Jediná “otravnost” oproti klasickému {Binding} je odlišné výchozí nastavení jeho módu – namísto OneWay používá OneTime. Ačkoliv toto opět napomáhá lepšímu výkonu pro neměnná data, je až nepříjemně snadné zapomenout explicitně uvést OneWay tam, kde je to třeba. Navíc, pokud zobrazujeme více hodnot z měnícího se datového zdroje, je nutnost pokaždé uvádět Mode . Naštěstí existuje řešení!

x:DefaultBindMode

V SDK verze 14393 přibyl nový atribut x:DefaultBindMode . Tato funkce umožňuje nastavit výchozí mód {x:Bind} pro element a jeho děti v XAML stromě.

Uveďme si jako příklad následující úryvek XAMLu:

<Grid>
<TextBlock Text="{x:Bind ViewModel.Symbol}" />
<TextBlock Text="{x:Bind ViewModel.Price}" />
<TextBlock Text="{x:Bind ViewModel.PriceChange}" />
</Grid>

view raw
OneTime.xaml
hosted with ❤ by GitHub

Protože mód nebyl explicitně nastaven, je OneTime a po iniciálním vyhodnocení hodnot se dále změny neprojeví. Nyní to změňme pomocí x:DefaultBindMode:

<Grid x:DefaultBindMode="OneWay">
<TextBlock Text="{x:Bind ViewModel.Symbol}" />
<TextBlock Text="{x:Bind ViewModel.Price}" />
<TextBlock Text="{x:Bind ViewModel.PriceChange}" />
</Grid>

view raw
OneWay.xaml
hosted with ❤ by GitHub

A je to – všechny TextBlock elementy se budou nyní měnit svůj text při každé změně navázaných vlastností.

Abychom si to ještě více usnadnili, pokud víme že v daném XAML souboru budou všechny bindingy nejspíše dynamické, můžeme změnit x:DefaultBindMode na úrovní root elementu:

<Page
x:DefaultBindMode="OneWay">

view raw
PageLevel.xaml
hosted with ❤ by GitHub

Samozřejmě je také snadné nastavení kdykoliv explicitně přepsat:

<StackPanel x:DefaultBindMode="OneWay">
<TextBox Text="{x:Bind ViewModel.Name, Mode=TwoWay}" />
<TextBlock Text="{x:Bind ViewModel.Name}" />
</StackPanel>

view raw
OverrideDefault.xaml
hosted with ❤ by GitHub

Zatímco TextBlock použije OneWay mód, TextBox použije TwoWay.

Skvělé využití má DefaultBindMode také při vývoji formulářů. Můžeme snadno nastavit výchozí hodnotu na TwoWay a nadále na mód nemusíme pamatovat:

<StackPanel x:DefaultBindMode="TwoWay">
<TextBox Header="First name" Text="{x:Bind ViewModel.FirstName}" />
<TextBox Header="Last name" Text="{x:Bind ViewModel.LastName}" />
<CheckBox Content="Is subscribed" IsChecked="{x:Bind ViewModel.IsSubscribed}" />
</StackPanel>

view raw
FormTwoWay.xaml
hosted with ❤ by GitHub

x:DefaultBindMode je malá, ale velmi praktická vlastnost XAMLu, která práci s x:Bind opravdu zjednodušuje!

WinUI

Buy me a coffeeBuy me a coffee

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> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

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