Spoiler
Avremo la navigazione dalla View principale verso una nuova View (e anche ritorno) tramite l’implementazione di INavigationService di Prism e passaggio di valori come parametro.
Prerequisiti
Questo articolo segue e amplia questo articolo.
Iniziamo
Cominceremo prima introducendo tutta la parte MVVM della nuova maschera che vogliamo mostrare. Poi faremo in modo che tutto funzioni e per ultimo vedremo come passare dei parametri le due.
PizzaLab.MAUI.ViewModels
Partiamo dalla modifica del progetto (Project) .ViewModels a cui andremo ad aggiungere il nostro nuovo ViewModel e lo chiameremo ChildViewModel
che deriverà dalla classe astratta ViewModelBase.
public class ChildViewModel : ViewModelBase
{
#region IDisposable
private bool _disposed = false;
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
}
_disposed = true;
}
base.Dispose(disposing);
}
#endregion
public ChildViewModel(
INavigationService navigationService
)
: base(navigationService)
{
}
}
PizzaLab.MAUI.Views
Aggiungiamo una .NET MAUI ContentPage (XAML)
che chiameremo ChildView
.
PizzaLab.MAUI
Modifichiamo MauiProgram.cs
aggiungendo la navigazione verso la nuova View che chiameremo ChildView:
containerRegistry.RegisterForNavigation<ChildView, ChildViewModel>("ChildView");
Ricompilando ora non ci saranno problemi ma ovviamente il nostro software si comporterà esattamente come prima di cominciare a leggere. Modifichiamo quindi gli altri elementi per creare la nostra navigazione.
PizzaLab.MAUI.ViewModels
Modfiichiamo MainViewModel.cs
aggiungendo il comando per l’apertura della maschera.
private readonly ICommand _openChildViewCommand;
public ICommand OpenChildViewCommand
=> _openChildViewCommand;
Andiamo a creare il metodo:
private async Task OpenChildViewAsync()
{
await NavigationService.NavigateAsync("ChildView");
}
E aggiungiamo la creazione del comando nel costruttore:
_openChildViewCommand = new Command(async () => await OpenChildViewAsync());
PizzaLab.MAUI.Views
Aggiungiamo un bottone su MainView.xaml che richiami il comando creato qui sopra:
<Button
Text="Open"
Command="{Binding OpenChildViewCommand}"
/>
Passaggio di parametri
Per passare dei parametri al cambio di View, i ViewModels hanno bisogno di implentare INavigationAware
e IInitialize
di Prism.
PizzaLab.MAUI.ViewModels
Modifichiamo ViewModelBase.cs
in questo modo:
public abstract class ViewModelBase : BindableBase, IDisposable, INavigationAware, IInitialize
E il suo corpo:
public virtual void OnNavigatedFrom(INavigationParameters parameters)
{
}
public virtual void OnNavigatedTo(INavigationParameters parameters)
{
}
public virtual void Initialize(INavigationParameters parameters)
{
}
Modifichiamo la chiamata di apertura in MainViewModel.cs
così:
private async Task OpenChildViewAsync()
{
await NavigationService.NavigateAsync("ChildView", new NavigationParameters
{ { "id", Guid.NewGuid() } }
);
}
Aggiungiamo il seguente codice in ChildViewModel.cs
:
public override async void Initialize(INavigationParameters parameters)
{
base.Initialize(parameters);
}
Creiamo una proprietà string
che useremo per mostrare il nostro Id sulla View:
private string _id;
public string Id
{
get { return _id; }
set { SetProperty(ref _id, value); }
}
E impostiamo la modifica di questa proprietà nel metodo Initialize
scritto sopra:
if (parameters.ContainsKey("id"))
{
Id = parameters.GetValue<Guid>("id").ToString();
}
PizzaLab.MAUI.Views
Modifichiamo ChildView.xaml mostrando l’Id:
<Label Text="{Binding Id}"
/>
Deploy
Ricompiliamo tutto, ecco il risultato:




Qui trovate i sorgenti del codice visto sopra: