Navigazione verso e da una nuova maschera e passaggio di valori.

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:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *