Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Tipp.
Ez a tartalom egy részlet az eBook, Enterprise Application Patterns Using .NET MAUI, elérhető a .NET Docs vagy egy ingyenesen letölthető PDF, hogy lehet olvasni offline.
MVVM-eszközkészlet
A Model-View-ViewModel (MVVM) minta nagyszerű szerkezeti alap az alkalmazások létrehozásához. Ebben a mintában a ViewModel lesz az alkalmazás gerince, mivel kommunikációt biztosít az előtérbeli felhasználói felület és a háttérösszetevők számára. A felhasználói felülettel való integráció érdekében a ViewModel tulajdonságaira és parancsaira támaszkodunk. A nézetfrissítés az alapul szolgáló nézetmodell vagy -modell változásaira válaszul című cikkben leírtak szerint a INotifyPropertyChanged
Nézetmodell felületén található felület lehetővé teszi a tulajdonságok módosításainak értesítését az érték módosításakor. Ezeknek a funkcióknak a megvalósítása azt jelenti, hogy a ViewModel végül nagyon részletessé válhat. Az alábbi kód például egy egyszerű ViewModel-et jelenít meg, amelynek tulajdonságai módosításokat váltanak ki:
public class SampleViewModel : INotifyPropertyChanged
{
private string _name;
private int _value;
public event PropertyChangedEventHandler PropertyChanged;
public string Name
{
get => _name;
set => SetPropertyValue(ref _name, value);
}
public int Value
{
get => _value;
set => SetPropertyValue(ref _value, value);
}
protected void SetPropertyValue<T>(ref T storageField, T newValue, [CallerMemberName] string propertyName = "")
{
if (Equals(storageField, newValue))
return;
storageField = newValue;
RaisePropertyChanged(propertyName);
}
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Bár bizonyos optimalizálásokat idővel el lehet végezni, továbbra is meglehetősen részletes kódkészlettel fogjuk végezni a ViewModel definiálását. Ezt a kódot nehéz lehet karbantartani, és hibalehetőséget okoz.
A CommunityToolkit.Mvvm NuGet-csomag (más néven MVVM-eszközkészlet) segítségével kezelheti és egyszerűsítheti ezeket a gyakori MVVM-mintákat. Az MVVM Eszközkészlet a .NET nyelv újabb funkcióival együtt lehetővé teszi az egyszerűsített logikát, a projektbe való könnyű bevezetést és a futtatókörnyezet függetlenségét. Az alábbi példa ugyanazt a Nézetmodellt mutatja be, amely az MVVM-eszközkészlethez tartozó összetevőket használja:
public partial class SampleViewModel : ObservableObject
{
[ObservableProperty]
private string _name;
[ObservableProperty]
private int _value;
}
Feljegyzés
Az MVVM-eszközkészletet a CommunityToolkit.Mvvm
csomag biztosítja. A csomag projekthez való hozzáadásáról további információt a Microsoft Fejlesztői központ MVVM-eszközkészletének bemutatása című témakörben talál.
Az eredeti példához képest drasztikusan csökkenthettük az általános összetettséget, és leegyszerűsítettük a ViewModel karbantarthatóságát. Az MVVM-eszközkészlet számos előre elkészített általános összetevővel és funkcióval rendelkezik, például a ObservableObject
fent bemutatottak, amelyek leegyszerűsítik és egységesítik az alkalmazás teljes kódját.
ObservableObject
Az MVVM-eszközkészlet biztosítja ObservableObject
, amely az objektumok alapjául ViewModel
szolgál, vagy bármely olyan objektumot, amelynek változásértesítéseket kell küldenie. Implementálja INotifyPropertyChanged
és INotifyPropertyChanging
segíti a tulajdonságok beállítását és a változások növelését. Az alábbiakban egy példa látható egy szabványos Nézetmodellre a következő használatával ObservableObject
:
public class SampleViewModel : ObservableObject
{
private string _name;
private int _value;
public string Name
{
get => _name;
set => SetProperty(ref _name, value);
}
public int Value
{
get => _value;
set => SetProperty(ref _value, value);
}
}
ObservableObject
kezeli a változásértesítések beállításához szükséges összes logikát a SetProperty
tulajdonságválasztó metódusával. Ha olyan tulajdonsága van, amely egy tulajdonságot Task<T>
ad vissza, a SetPropertyAndNotifyOnCompletion
metódussal késleltetheti a tulajdonságváltozás közzétételét a tevékenység befejezéséig. A metódusok OnPropertyChanged
és OnPropertyChanging
az objektumban szükség esetén a tulajdonságváltozások emelésére is használhatók.
További információ: ObservableObject
ObservableObject az MVVM Eszközkészlet fejlesztői központban.
RelayCommand
és AsyncRelayCommand
A .NET-vezérlők MAUI (például egy gombra koppintás vagy egy gyűjteményből származó elem kijelölése) és a ViewModel közötti interakció a ICommand
felülettel történik. A .NET MAUI az objektum alapértelmezett implementációjával ICommand
Command
rendelkezik. A .NET MAUImeglehetősen alapszintű, és nem támogatja Command
a speciálisabb funkciókat, például az aszinkron munka és a parancsvégrehajtás állapotát.
Az MVVM eszközkészlet két parancsot tartalmaz, RelayCommand
és AsyncRelayCommand
.
RelayCommand
Olyan helyzetekre szolgál, amikor szinkron kódot kell végrehajtania, és a .NET-objektumhoz MAUICommand
hasonló implementációval rendelkezik.
Feljegyzés
Annak ellenére, hogy a .NET MAUIés hasonló, a használata Command
lehetővé teszi a ViewModel függetlenítését a közvetlen .NET-hivatkozásoktólRelayCommand
.RelayCommand
MAUI Ez azt jelenti, hogy a ViewModel hordozhatóbb, így könnyebben újrafelhasználható a projektek között.
AsyncRelayCommand
számos további funkciót biztosít az aszinkron munkafolyamatok használatakor. Ez meglehetősen gyakori a ViewModelben, mivel általában adattárakkal, API-kkal, adatbázisokkal és más, azokat használó async/await
rendszerekkel kommunikálunk. A AsyncRelayCommand
konstruktor végrehajt egy végrehajtási feladatot, amely a Func<Task>
konstruktor részeként visszatérő Task
meghatalmazottként vagy meghatalmazottként van definiálva. Amíg a végrehajtási feladat fut, figyelni fogja a tevékenység állapotát, AsyncRelayCommand
és frissítéseket biztosít a IsRunning
tulajdonság használatával. A IsRunning
tulajdonság a felhasználói felülethez köthető, amely segít kezelni a vezérlőállapotokat, például betöltést jelenít meg egy ActivityIndicator
vezérlővel, vagy letiltja/engedélyezi a vezérlőt. A végrehajtási feladat végrehajtása közben a Cancel
metódus meghívható a végrehajtási tevékenység visszavonásának megkísérlésére, ha támogatott.
Alapértelmezés szerint AsyncRelayCommand
nem engedélyezi az egyidejű végrehajtást. Ez nagyon hasznos azokban az esetekben, amikor a felhasználó véletlenül többször is koppinthat egy vezérlőre egy hosszú ideig futó vagy költséges művelet végrehajtásához. A feladat végrehajtása AsyncRelayCommand
során a rendszer automatikusan meghívja az eseményt CanExecuteChanged
. A .NET-ben MAUIazok a vezérlők, amelyek támogatják az Command
eseményt és CommandParameter
a tulajdonságokat, például Button
, figyelik az eseményt, és automatikusan engedélyezik vagy letiltják azt a végrehajtás során. Ezt a funkciót felül lehet bírálni egy egyéni canExecute
paraméterrel, vagy beállíthatja a AsyncRelayCommandOptions.AllowConcurrentExecutions
jelölőt a konstruktorban.
A parancsok implementálásával kapcsolatos részletesebb információkért tekintse meg az MVVM fejezet parancsainak implementálása című szakaszát. Részletes információk az RelayCommand
MVVM Eszközkészlet fejlesztői központ parancsolatábanAsyncRelayCommand
.
Forrásgenerátorok
Az MVVM Toolkit-összetevők beépített használatával jelentősen leegyszerűsítheti a ViewModel-et. Az MVVM-eszközkészlet lehetővé teszi, hogy még tovább egyszerűsítse a gyakori kódhasználati eseteket a Forrásgenerátorok használatával. Az MVVM-eszközkészlet forrásgenerátorai konkrét attribútumokat keresnek a kódban, és burkolókat hozhatnak létre tulajdonságokhoz és parancsokhoz.
Fontos
Az MVVM-eszközkészlet forrásgenerátorai olyan kódot hoznak létre, amely a meglévő objektumokhoz ad adalékot. Emiatt a forrásgenerátort használó objektumokat meg kell jelölni partial
.
Az MVVM Eszközkészlet ObservableProperty
attribútum alkalmazható olyan objektumok mezőire, amelyektől ObservableObject
öröklődnek, és egy olyan tulajdonsággal burkolják körbe a magánmezőket, amelyek módosításokat generálnak. Az alábbi kód egy példát mutat be a ObservableObject
mező attribútumának _name
használatára:
public partial class SampleViewModel : ObservableObject
{
[ObservableProperty]
private string _name;
}
ObservableProperty
A mezőre _name
alkalmazott attribútummal a forrásgenerátor fut, és létrehoz egy másik részleges osztályt a következő kóddal:
partial class SampleViewModel
{
public string Name
{
get => _name;
set
{
if (!EqualityComparer<string>.Default.Equals(_name, value))
{
OnNameChanging(value);
OnPropertyChanging("Name");
_name = value;
OnNameChanged(value);
OnPropertyChanged("Name");
}
}
}
}
A generált SampleViewModel
a privát _name
mezőt használta, és létrehozott egy új Name
tulajdonságot, amely megvalósítja a változásértesítések létrehozásához szükséges összes logikát.
Az MVVM Toolkit RelayCommand
attribútum alkalmazható az adott ObservableObject
metódusokra, és létrehoz egy megfelelő RelayCommand
vagy AsyncRelayCommand
. Az alábbi kód példákat mutat be az RelayCommand
attribútum használatára:
public partial class SampleViewModel : ObservableObject
{
public INavigationService NavigationService { get; set; }
[ObservableProperty]
private string _name;
[ObservableProperty]
bool _isValid;
[RelayCommand]
private Task SettingsAsync()
{
return NavigationService.NavigateToAsync("Settings");
}
[RelayCommand]
private void Validate()
{
IsValid = !string.IsNullOrEmpty(Name);
}
}
A RelayCommand
metódusra Validate
alkalmazott metódus érvényesítési RelayCommand
értéket hoz létreValidateCommand
, mert visszaadjavoid
, és a SettingsAsync
metódus létrehoz egy AsyncRelayCommand
elnevezettetSettingsCommand
. A forrásgenerátor a következő kódot hozza létre más részleges osztályokban:
partial class SampleViewModel
{
private AsyncRelayCommand? settingsCommand;
SettingsCommand => settingsCommand ??= new AsyncRelayCommand(SettingsAsync);
}
partial class SampleViewModel
{
private RelayCommand? validateCommand;
public IRelayCommand ValidateCommand => validateCommand ??= new RelayCommand(Validate);
}
A ViewModel metódusainak implementációval való ICommand
burkolásának összetettségét a forrásgenerátor kezelte.
Az MVVM eszközkészlet-forrásgenerátorokkal kapcsolatos további információkért lásd az MVVM eszközkészlet fejlesztői központjában található MVVM-forrásgenerátorokat .
Összegzés
Az MVVM-eszközkészlet nagyszerű módszer a ViewModel-kód szabványosítására és egyszerűsítésére. Az MVVM eszközkészlet a standard MVVM-összetevők, például ObservableObject
és Async/RelayCommand
. A forrásgenerátorok segítenek leegyszerűsíteni a ViewModel-tulajdonságokat és -parancsokat a felhasználói felületi interakciókhoz szükséges összes sablonkód generálásával. Az MVVM Eszközkészlet az ebben a fejezetben bemutatottakon kívül még több funkciót kínál. Az MVVM-eszközkészletről további információt az MVVM Eszközkészlet bemutatása az MVVM Eszközkészlet fejlesztői központban című témakörben talál.