loading experience

.NET MAUI

MVVM in .NET MAUI con CommunityToolkit.Mvvm

ViewModel puliti con proprietà osservabili e comandi generati dal compilatore.

MVVM in .NET MAUI con CommunityToolkit.Mvvm

Il pattern MVVM separa l'interfaccia (View) dalla logica di presentazione (ViewModel). Il pacchetto CommunityToolkit.Mvvm elimina quasi tutto il codice ripetitivo grazie ai generatori di sorgenti.

La View mostra, il ViewModel decide, i servizi lavorano sui dati.
La View mostra, il ViewModel decide, i servizi lavorano sui dati.

Un ViewModel completo

public partial class ProfiloViewModel(IProfiloService servizio) : ObservableObject
{
    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(SalvaCommand))]
    public partial string Nome { get; set; } = "";

    [ObservableProperty]
    public partial bool InSalvataggio { get; set; }

    private bool PuoSalvare() => !string.IsNullOrWhiteSpace(Nome) && !InSalvataggio;

    [RelayCommand(CanExecute = nameof(PuoSalvare))]
    private async Task SalvaAsync()
    {
        InSalvataggio = true;
        try { await servizio.SalvaAsync(Nome); }
        finally { InSalvataggio = false; }
    }
}

Il generatore crea la notifica di modifica delle proprietà e il comando SalvaCommand, che si abilita e disabilita da solo in base a PuoSalvare.

La View

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:MiaApp.ViewModels"
             x:DataType="vm:ProfiloViewModel">
    <VerticalStackLayout Padding="20" Spacing="12">
        <Entry Text="{Binding Nome}" Placeholder="Nome" />
        <Button Text="Salva" Command="{Binding SalvaCommand}" />
        <ActivityIndicator IsRunning="{Binding InSalvataggio}" />
    </VerticalStackLayout>
</ContentPage>

x:DataType attiva i binding compilati: verificati a compilazione e più veloci a runtime.

Registrazione

builder.Services.AddSingleton<IProfiloService, ProfiloService>();
builder.Services.AddTransient<ProfiloViewModel>();
builder.Services.AddTransient<ProfiloPage>();

La pagina riceve il ViewModel nel costruttore e lo assegna al BindingContext. Per far comunicare ViewModel diversi senza riferimenti diretti si usa WeakReferenceMessenger, che sostituisce il vecchio MessagingCenter.

Commenti (0)

Nessun commento ancora.

Lascia un commento