Dela via


MVVM Toolkit-funktioner

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.

Företagsprogrammönster med .NET MAUI eBook-omslagsminiatyr.

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 ObservableObjectfinns 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 RelayCommandAsyncRelayCommand. 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.RelayCommandMAUI 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 AsyncRelayCommandSettingsCommand. 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.