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.
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.