Shrnutí kapitoly 18. MVVM
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á.
Jedním z nejlepších způsobů, jak navrhovat aplikaci, je oddělením uživatelského rozhraní od základního kódu, který se někdy označuje jako obchodní logika. Existuje několik technik, ale ten, který je přizpůsobený pro prostředí založená na XAML, se označuje jako Model-View-ViewModel nebo MVVM.
Vzájemné vztahy virtuálních počítačů MVVM
Aplikace MVVM má tři vrstvy:
- Model poskytuje podkladová data, někdy prostřednictvím souborů nebo webových přístupů.
- Zobrazení je uživatelské rozhraní nebo prezentační vrstva, obecně implementovaná v XAML.
- Model ViewModel připojí model a zobrazení.
Model je ignorant modelu ViewModel a ViewModel je ignorant zobrazení. Tyto tři vrstvy se obvykle vzájemně propojují pomocí následujících mechanismů:
V mnoha menších programech (a dokonce větších) často model chybí nebo je jeho funkce integrována do modelu ViewModel.
Modely Zobrazení a datová vazba
Aby bylo možné pracovat s datovými vazbami, model ViewModel musí být schopen oznámit zobrazení při změně vlastnosti ViewModel. Model ViewModel to provede implementací INotifyPropertyChanged
rozhraní v System.ComponentModel
oboru názvů. Jedná se spíše o část .NET než Xamarin.Forms. (Obecně se ViewModels pokouší zachovat nezávislost platformy.)
Rozhraní INotifyPropertyChanged
deklaruje jednu událost s názvem PropertyChanged
, která označuje vlastnost, která se změnila.
Hodiny Modelu zobrazení
Knihovna Book.Toolkit definuje vlastnost typuDateTime
, která se mění na základě časovače.DateTimeViewModel
Xamarin.Forms Třída implementuje INotifyPropertyChanged
a aktivuje PropertyChanged
událost pokaždé, když se DateTime
vlastnost změní.
Ukázka MvvmClock vytvoří instanci tohoto modelu ViewModel a pomocí datových vazeb na model ViewModel zobrazí aktualizované informace o datu a čase.
Interaktivní vlastnosti v modelu ViewModel
Vlastnosti v modelu ViewModel mohou být interaktivnější, jak ukazuje SimpleMultiplierViewModel
třída, která je součástí ukázky SimpleMultiplier . Datové vazby poskytují násobené a násobené hodnoty ze dvou Slider
prvků a zobrazí součin s hodnotou Label
. V xaml však můžete provádět rozsáhlé změny v tomto uživatelském rozhraní bez následných změn souboru ViewModel nebo souboru s kódem.
Model zobrazení barev
Xamarin.FormsKnihovna ColorViewModel
Book.Toolkit integruje barevné modely RGB a HSL. Ukazuje se v ukázce HslSliders :
Zjednodušení modelu ViewModel
Kód v ViewModels lze zjednodušit definováním OnPropertyChanged
metody pomocí atributu CallerMemberName
, který získá název volající vlastnosti automaticky. Třída ViewModelBase
v knihovně Xamarin.FormsBook.Toolkit to dělá a poskytuje základní třídu pro ViewModels.
Příkazové rozhraní
MVVM pracuje s datovými vazbami a datové vazby pracují s vlastnostmi, takže MVVM se zdá být nedostatečné, pokud jde o zpracování Clicked
události Button
nebo Tapped
události události TapGestureRecognizer
. Pokud chcete, aby objekty ViewModels zpracovávaly takové události, Xamarin.Forms podporuje příkazové rozhraní.
Příkazové rozhraní se manifestuje ve Button
dvou veřejných vlastnostech:
Command
typuICommand
(definovanéhoSystem.Windows.Input
v oboru názvů)CommandParameter
typuObject
Chcete-li podporovat příkazové rozhraní, ViewModel musí definovat vlastnost typu ICommand
, která je pak data svázána s Command
vlastností objektu Button
. Rozhraní ICommand
deklaruje dvě metody a jednu událost:
- Metoda
Execute
s argumentem typuobject
- Metoda
CanExecute
s argumentem typuobject
, který vracíbool
- Událost
CanExecuteChanged
Objekt ViewModel interně nastaví každou vlastnost typu ICommand
na instanci třídy, která implementuje ICommand
rozhraní. Prostřednictvím datové vazby Button
, zpočátku volá metodu CanExecute
a zakáže sám sebe, pokud metoda vrátí false
. Také nastaví obslužnou rutinu CanExecuteChanged
události a volání CanExecute
při každém vyvolání této události. Pokud je tato možnost Button
povolená, volá metodu Execute
pokaždé, když na ni Button
kliknete.
Možná máte některé modely ViewModel, které jsou předprodejní Xamarin.Formsa tyto modely již mohou podporovat rozhraní příkazů. Pro nové Modely ViewModel, které mají být použity pouze s Xamarin.Forms, Xamarin.Forms poskytuje Command
třídu a Command<T>
třídu, která implementuje ICommand
rozhraní. Obecný typ je typ argumentu pro metody Execute
a CanExecute
metody.
Provádění jednoduchých metod
Ukázka PowersOfThree ukazuje použití příkazového rozhraní v modelu ViewModel. Třída PowersViewModel
definuje dvě vlastnosti typu ICommand
a také definuje dvě privátní vlastnosti, které předá nejjednodušší Command
konstruktoru. Program obsahuje datové vazby z tohoto modelu ViewModel na Command
vlastnosti dvou Button
prvků.
Prvky Button
lze snadno nahradit TapGestureRecognizer
objekty v XAML beze změn kódu.
Kalkulačka, téměř
Ukázka AddingMachine využívá jak Execute
metody , tak CanExecute
i metody ICommand
. Používá třídu AdderViewModel
v knihovně Xamarin.FormsBook.Toolkit. Model ViewModel obsahuje šest vlastností typu ICommand
. Tyto jsou inicializovány z konstruktoru a Command
konstruktoru Command
Command<T>
a konstruktoru . Command<T>
Command
Číselné klíče přidávaného počítače jsou všechny vázány na vlastnost, která je inicializována Command<T>
s , a string
argumentem pro Execute
a CanExecute
identifikuje konkrétní klíč.
ViewModels a životní cyklus aplikace
Použitý AdderViewModel
v ukázce AddingMachine také definuje dvě metody pojmenované SaveState
a RestoreState
. Tyto metody se volají z aplikace, když přejde do režimu spánku a když se znovu spustí.