Shrnutí kapitoly 16. Datová vazba
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á.
Programátoři často zapisují obslužné rutiny událostí, které detekují, kdy se změnila vlastnost jednoho objektu, a používají ji ke změně hodnoty vlastnosti v jiném objektu. Tento proces lze automatizovat pomocí techniky datové vazby. Datové vazby jsou obvykle definovány v JAZYCE XAML a stávají se součástí definice uživatelského rozhraní.
Tyto datové vazby velmi často připojují objekty uživatelského rozhraní k podkladovým datům. Toto je technika, která se zkoumá více v kapitole 18. MVVM. Datové vazby ale můžou také propojit dva nebo více prvků uživatelského rozhraní. Většina prvních příkladů datové vazby v této kapitole ukazuje tuto techniku.
Základy vazeb
Do datové vazby se podílí několik vlastností, metod a tříd:
- Třída
Binding
je odvozena zBindingBase
a zapouzdřuje mnoho charakteristik datové vazby. - Vlastnost
BindingContext
je definována třídou.BindableObject
- Metoda
SetBinding
je také definovánaBindableObject
třídou. - Třída
BindableObjectExtensions
definuje tři dalšíSetBinding
metody.
Následující dvě třídy podporují rozšíření značek XAML pro vazby:
BindingExtension
podporuje rozšíření značek.Binding
ReferenceExtension
podporuje rozšíření značek.x:Reference
Do datové vazby se zapojují dvě rozhraní:
INotifyPropertyChanged
in theSystem.ComponentModel
namespace is for implement notification when a property changesIValueConverter
slouží k definování malých tříd, které v datových vazbách převádějí hodnoty z jednoho typu na jiný.
Datová vazba spojuje dvě vlastnosti stejného objektu nebo (častěji) dva různé objekty. Tyto dvě vlastnosti se označují jako zdroj a cíl. Obecně platí, že změna ve zdrojové vlastnosti způsobí, že v cílové vlastnosti dojde ke změně, ale někdy je směr obrácený. Nedbající:
- cílovou vlastnost musí být zajištěna pomocí
BindableProperty
- Zdrojová vlastnost je obecně členem třídy, která implementuje
INotifyPropertyChanged
Třída, která implementuje INotifyPropertyChanged
vyvolá PropertyChanged
událost, když vlastnost změní hodnotu. BindableObject
implementuje INotifyPropertyChanged
a automaticky aktivuje PropertyChanged
událost, když vlastnost zálohovaná BindableProperty
hodnotami změn, ale můžete napsat vlastní třídy, které implementují INotifyPropertyChanged
bez odvození z BindableObject
.
Kód a XAML
Ukázka OpacityBindingCode ukazuje, jak nastavit datovou vazbu v kódu:
- Zdroj je
Value
vlastnost aSlider
- Cílem je
Opacity
vlastnostLabel
Dva objekty jsou spojeny nastavením BindingContext
Label
objektu na Slider
objekt. Dvě vlastnosti jsou spojeny voláním SetBinding
rozšiřující metody odkazující OpacityProperty
na Label
bindable vlastnost a Value
vlastnost Slider
vyjádřené jako řetězec.
Slider
Manipulace s poté způsobíLabel
, že se zeslabí a zmizí ze zobrazení.
OpacityBindingXaml je stejný program se sadou datových vazeb v XAML. Label
Vlastnost BindingContext
je nastavena na x:Reference
rozšíření značky odkazující Slider
na , a Opacity
vlastnost Label
je nastavena na Binding
rozšíření značky s jeho Path
vlastností odkazující na Value
vlastnost Slider
.
Zdroj a BindingContext
Ukázka BindingSourceCode ukazuje alternativní přístup v kódu. Objekt Binding
je vytvořen nastavením Source
vlastnosti na Slider
objekt a Path
vlastnost na Hodnotu. Metoda SetBinding
BindableObject
je pak volána na objektu Label
.
Konstruktor Binding
byl také použit k definování objektu.Binding
Ukázka BindingSourceXaml ukazuje srovnatelnou techniku v jazyce XAML. Vlastnost Opacity
objektu Label
je nastavena na Binding
rozšíření značek s Path
nastavenou na Value
vlastnost a Source
nastavena na vložené x:Reference
rozšíření značek.
V souhrnu existují dva způsoby, jak odkazovat na zdrojový objekt vazby:
BindingContext
Prostřednictvím vlastnosti cíleSource
Prostřednictvím vlastnosti samotného objektuBinding
Pokud jsou zadány oba, druhá má přednost. Výhodou BindingContext
je, že se šíří prostřednictvím vizuálního stromu. To je velmi užitečné, pokud je více cílových vlastností svázané se stejným zdrojovým objektem.
Program WebViewDemo demonstruje tuto techniku s elementem WebView
. Dva Button
prvky pro navigaci dozadu a vpřed dědí BindingContext
z nadřazeného objektu, který odkazuje na WebView
. Vlastnosti IsEnabled
těchto dvou tlačítek pak mají jednoduchá Binding
rozšíření značek, která cílí na vlastnosti tlačítka IsEnabled
na základě nastavení CanGoBack
a CanGoForward
vlastností jen pro WebView
čtení .
Režim vazby
Mode
Nastavte vlastnost Binding
na člen výčtuBindingMode
:
OneWay
aby změny ve zdrojové vlastnosti ovlivnily cíl.OneWayToSource
aby změny v cílové vlastnosti ovlivnily zdrojTwoWay
aby změny ve zdroji a cíli vzájemně ovlivnilyDefault
k použití zadanéhoDefaultBindingMode
při vytvoření cíleBindableProperty
. Pokud nebyla zadána žádná, výchozí hodnota jeOneWay
pro normální vlastnosti svázatelné aOneWayToSource
pro vlastnosti s možností vazby jen pro čtení.
Poznámka:
Výčet BindingMode
nyní zahrnuje OnTime
také použití vazby pouze v případě, že se kontext vazby změní, a ne při změně zdrojové vlastnosti.
Vlastnosti, které jsou pravděpodobně cílem datových vazeb ve scénářích MVVM, mají obecně hodnotu DefaultBindingMode
TwoWay
. Jedná se o:
Value
majetkuSlider
aStepper
IsToggled
majetkuSwitch
Text
majetkuEntry
,Editor
aSearchBar
Date
majetkuDatePicker
Time
majetkuTimePicker
BindingModes ukázka ukazuje čtyři režimy vazby s datovou vazbou, kde cíl je FontSize
vlastnost Label
a zdroj je Value
vlastnost Slider
. To umožňuje Slider
každému řídit velikost písma odpovídajícího Label
. Ale Slider
prvky nejsou inicializovány, protože DefaultBindingMode
vlastnost FontSize
je OneWay
.
Ukázka ReverseBinding nastaví vazby na Value
vlastnost Slider
odkazující FontSize
na vlastnost každého Label
. Zdá se, že je to zpětně, ale funguje lépe při inicializaci Slider
prvků, protože Value
vlastnost Slider
má hodnotu DefaultBindingMode
TwoWay
.
To je podobné tomu, jak jsou vazby definovány v MVVM a tento typ vazby použijete často.
Formátování řetězců
Pokud je cílová vlastnost typu string
, můžete použít StringFormat
vlastnost definovanou BindingBase
k převodu zdroje na .string
StringFormat
Nastavte vlastnost na formátovací řetězec .NET, který byste použili se statickým String.Format
formátem k zobrazení objektu. Při použití tohoto formátovacího řetězce v rámci rozšíření značek ho obklopte jednoduchými uvozovkami, takže složené závorky nebudou omylem za vložené rozšíření značek.
Ukázka ShowViewValues ukazuje, jak se používá StringFormat
v XAML.
Ukázka WhatSizeBindings ukazuje zobrazení velikosti stránky s vazbami na Width
vlastnosti Height
objektu ContentPage
.
Proč se tomu říká "Cesta"?
Vlastnost Path
Binding
je volána, protože může být řadou vlastností a indexerů oddělených tečkami. Ukázka BindingPathDemos ukazuje několik příkladů.
Převaděče hodnot vazeb
Pokud jsou zdrojové a cílové vlastnosti vazby různé typy, můžete převést mezi typy pomocí převaděče vazeb. Toto je třída, která implementuje IValueConverter
rozhraní a obsahuje dvě metody: Convert
převést zdroj na cíl a ConvertBack
převést cíl na zdroj.
Třída IntToBoolConverter
v knihovně Xamarin.FormsBook.Toolkit je příkladem převodu na .bool
int
Ukazuje se ukázkou ButtonEnabler, která povoluje Button
pouze v případě, že byl do znaku Entry
zadán alespoň jeden znak .
Třída BoolToStringConverter
převede hodnotu bool
na a string
definuje dvě vlastnosti, které určují, pro jaký text má být vrácen false
a true
hodnoty.
Je BoolToColorConverter
to podobné. Ukázka SwitchText ukazuje použití těchto dvou převaděčů k zobrazení různých textů v různých barvách na Switch
základě nastavení.
Obecný BoolToObjectConverter
může nahradit BoolToStringConverter
a BoolToColorConverter
sloužit jako generalizovaný bool
převaděč -to-object libovolného typu.
Vazby a vlastní zobrazení
Vlastní ovládací prvky můžete zjednodušit pomocí datových vazeb. NewCheckBox.cs
Soubor kódu definuje Text
, , TextColor
, FontSize
FontAttributes
, a IsChecked
vlastnosti, ale nemá žádnou logiku pro vizuály ovládacího prvku.
Místo toho NewCheckBox.cs.xaml
soubor obsahuje všechny značky vizuálů ovládacího prvku prostřednictvím datových vazeb na Label
prvky na základě vlastností definovaných v souboru kódu.
Ukázka NewCheckBoxDemo demonstruje NewCheckBox
vlastní ovládací prvek.