Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Dricks
Det här innehållet är ett utdrag från eBook, Enterprise Application Patterns Using .NET MAUI, tillgängligt på .NET Docs eller som en kostnadsfri nedladdningsbar PDF som kan läsas offline.
MVVM Toolkit
MVVM-mönstret (Model-View-View-ViewModel) är en bra strukturell grund för att skapa våra program. I det här mönstret blir ViewModel ryggraden i vårt program eftersom det ger kommunikation till klientdelens användargränssnitt och säkerhetskopieringskomponenter. För att kunna integrera med användargränssnittet förlitar vi oss på ViewModels egenskaper och kommandon. Som beskrivs i Uppdatera vyer som svar på ändringar i den underliggande vymodellen eller modellen tillåter INotifyPropertyChanged
gränssnittet i vår ViewModel att ändringar i våra egenskaper meddelas när värdet ändras. Implementeringen av alla dessa funktioner innebär att vår ViewModel kan bli mycket utförlig. Följande kod visar till exempel en enkel ViewModel med egenskaper som skapar ändringar:
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));
}
}
Vissa optimeringar kan göras över tid, men vi kommer fortfarande att få en ganska utförlig uppsättning kod för att definiera vår ViewModel. Den här koden kan vara svår att underhålla och blir felbenägen.
NuGet-paketet CommunityToolkit.Mvvm (även kallat MVVM Toolkit) kan användas för att åtgärda och förenkla dessa vanliga MVVM-mönster. MVVM Toolkit, tillsammans med nyare funktioner i .NET-språket, möjliggör förenklad logik, enkel implementering i ett projekt och körningsberoende. Exemplet nedan visar samma ViewModel med hjälp av komponenter som medföljer MVVM Toolkit:
public partial class SampleViewModel : ObservableObject
{
[ObservableProperty]
private string _name;
[ObservableProperty]
private int _value;
}
Kommentar
MVVM Toolkit medföljer CommunityToolkit.Mvvm
paketet. Information om hur du lägger till paketet i projektet finns i Introduktion till MVVM Toolkit i Microsoft Developer Center.
Jämfört med det ursprungliga exemplet kunde vi drastiskt minska den övergripande komplexiteten och förenkla underhållbarheten för vår ViewModel. MVVM Toolkit levereras med många fördefinierade vanliga komponenter och funktioner, till exempel ovanstående ObservableObject
, som förenklar och standardiserar den kod som vi har i hela programmet.
ObservableObject
MVVM Toolkit tillhandahåller ObservableObject
som är avsedd att användas som bas för våra ViewModel
objekt eller objekt som behöver skapa ändringsmeddelanden. Den implementerar INotifyPropertyChanged
och INotifyPropertyChanging
tillsammans med hjälpmetoder för att ange egenskaper och skapa ändringar. Nedan visas ett exempel på en Standard ViewModel med hjälp av 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
hanterar all logik som behövs för att skapa ändringsmeddelanden med hjälp SetProperty
av metoden i egenskapsuppsättningen. Om du har en egenskap som returnerar en Task<T>
SetPropertyAndNotifyOnCompletion
kan metoden användas för att fördröja publiceringen av en egenskapsändring tills aktiviteten har slutförts.
OnPropertyChanged
Metoderna och OnPropertyChanging
som också kan användas för att skapa egenskapsändringar där det behövs i objektet.
Mer detaljerad information om ObservableObject
finns i ObservableObject i MVVM Toolkit Developer Center.
RelayCommand
och AsyncRelayCommand
Interaktion mellan .NET-kontroller MAUI (till exempel genom att trycka på en knapp eller välja ett objekt från en samling) och ViewModel görs med ICommand
gränssnittet. .NET MAUI levereras med en standardimplementering av ICommand
med Command
-objektet. .NET MAUIär Command
ganska grundläggande och saknar stöd för mer avancerade funktioner, till exempel stöd för asynkront arbete och kommandokörningsstatus.
MVVM Toolkit levereras med två kommandon och RelayCommand
AsyncRelayCommand
.
RelayCommand
är avsedd för situationer där du har synkron kod att köra och har en ganska liknande implementering som .NET-objektet MAUICommand
.
Kommentar
Även om .NET MAUIoch är liknande kan du med hjälp av Command
koppla bort Din ViewModel från alla direkta .NET-referenserRelayCommand
.RelayCommand
MAUI Det innebär att Din ViewModel är mer portabel, vilket leder till enklare återanvändning mellan projekt.
AsyncRelayCommand
innehåller många ytterligare funktioner när du arbetar med asynkrona arbetsflöden. Detta är ganska vanligt i vår ViewModel eftersom vi vanligtvis kommunicerar med lagringsplatser, API:er, databaser och andra system som använder async/await
. Konstruktorn AsyncRelayCommand
tar in en körningsuppgift som definieras som en Func<Task>
eller ett ombud som returneras Task
som en del av konstruktorn. Medan körningsaktiviteten körs AsyncRelayCommand
övervakar den aktivitetens tillstånd och tillhandahåller uppdateringar med hjälp av IsRunning
egenskapen . Egenskapen IsRunning
kan bindas till användargränssnittet som hjälper till att hantera kontrolltillstånd, till exempel att visa inläsning med en ActivityIndicator
eller inaktivera/aktivera en kontroll. Medan körningsuppgiften körs Cancel
kan metoden anropas för att försöka avbryta körningsaktiviteten om den stöds.
Som standard AsyncRelayCommand
tillåter inte samtidig körning. Detta är mycket användbart i situationer där en användare oavsiktligt kan trycka på en kontroll flera gånger för att köra en tidskrävande eller kostsam åtgärd. Under aktivitetskörningen AsyncRelayCommand
anropas CanExecuteChanged
händelsen automatiskt. I .NET MAUIlyssnar kontroller som stöder Command
egenskaperna och CommandParameter
, till exempel Button
, på den här händelsen och aktiverar eller inaktiverar den automatiskt under körningen. Den här funktionen kan åsidosättas med hjälp av en anpassad canExecute
parameter eller genom att ange AsyncRelayCommandOptions.AllowConcurrentExecutions
flaggan i konstruktorn.
Mer detaljerad information om hur du implementerar kommandon finns i avsnittet Implementera kommandon i MVVM-kapitlet. Detaljerad information för RelayCommand
och AsyncRelayCommand
är tillgänglig i kommandot för MVVM Toolkit Developer Center.
Källgeneratorer
Med MVVM Toolkit-komponenterna kan du förenkla vår ViewModel avsevärt. Med MVVM Toolkit kan du förenkla vanliga kodanvändningsfall ytterligare med hjälp av källgeneratorer. MVVM Toolkit-källgeneratorerna letar efter specifika attribut i vår kod och kan generera omslutningar för egenskaper och kommandon.
Viktigt!
MVVM Toolkit Source Generators genererar kod som är additiv till våra befintliga objekt. Därför måste alla objekt som utnyttjar en källgenerator markeras som partial
.
Attributet MVVM Toolkit ObservableProperty
kan tillämpas på fält i objekt som ärver från ObservableObject
och omsluter ett privat fält med en egenskap som genererar ändringar. Följande kod visar ett exempel på hur du använder ObservableObject
attributet i _name
fältet:
public partial class SampleViewModel : ObservableObject
{
[ObservableProperty]
private string _name;
}
Med attributet ObservableProperty
som tillämpas på _name
fältet körs källgeneratorn och genererar en annan partiell klass med följande kod:
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");
}
}
}
}
Den genererade SampleViewModel
har använt det privata _name
fältet och genererat en ny Name
egenskap som implementerar all logik som behövs för att skapa ändringsmeddelanden.
MVVM Toolkit-attributet RelayCommand
kan tillämpas på metoder i en ObservableObject
och skapar en motsvarande RelayCommand
eller AsyncRelayCommand
. Följande kod visar exempel på hur du använder attributet RelayCommand
:
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);
}
}
Den RelayCommand
som tillämpas på Validate
metoden genererar en RelayCommand
verifiering ValidateCommand
eftersom den har en void
retur och metoden genererar en SettingsAsync
namngiven AsyncRelayCommand
SettingsCommand
. Källgeneratorn genererar följande kod i andra partiella klasser:
partial class SampleViewModel
{
private AsyncRelayCommand? settingsCommand;
SettingsCommand => settingsCommand ??= new AsyncRelayCommand(SettingsAsync);
}
partial class SampleViewModel
{
private RelayCommand? validateCommand;
public IRelayCommand ValidateCommand => validateCommand ??= new RelayCommand(Validate);
}
All komplexitet i att omsluta våra ViewModel-metoder med en ICommand
implementering har hanterats av källgeneratorn.
Mer detaljerad information om MVVM Toolkit-källgeneratorer finns i MVVM-källgeneratorer i MVVM Toolkit Developer Center.
Sammanfattning
MVVM Toolkit är ett bra sätt att standardisera och förenkla vår ViewModel-kod. MVVM-verktygslådan erbjuder bra implementeringar av MVVM-standardkomponenter som ObservableObject
och Async/RelayCommand
. Källgeneratorerna hjälper till att förenkla våra ViewModel-egenskaper och kommandon genom att generera all standardkod som behövs för interaktion med användargränssnittet. MVVM Toolkit erbjuder ännu fler funktioner utanför vad som har visats i det här kapitlet. Mer information om MVVM Toolkit finns i Introduktion till MVVM Toolkit i MVVM Toolkit Developer Center.