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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Grid> | |
<TextBlock Text="{x:Bind ViewModel.Symbol}" /> | |
<TextBlock Text="{x:Bind ViewModel.Price}" /> | |
<TextBlock Text="{x:Bind ViewModel.PriceChange}" /> | |
</Grid> |
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
:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Grid x:DefaultBindMode="OneWay"> | |
<TextBlock Text="{x:Bind ViewModel.Symbol}" /> | |
<TextBlock Text="{x:Bind ViewModel.Price}" /> | |
<TextBlock Text="{x:Bind ViewModel.PriceChange}" /> | |
</Grid> |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Page | |
… | |
x:DefaultBindMode="OneWay"> |
Samozřejmě je také snadné nastavení kdykoliv explicitně přepsat:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<StackPanel x:DefaultBindMode="OneWay"> | |
<TextBox Text="{x:Bind ViewModel.Name, Mode=TwoWay}" /> | |
<TextBlock Text="{x:Bind ViewModel.Name}" /> | |
</StackPanel> |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
x:DefaultBindMode
je malá, ale velmi praktická vlastnost XAMLu, která práci s x:Bind
opravdu zjednodušuje!