Nawigacja w Prism 9.0
W Prism 9.0, Navigation jest kluczowym elementem, który umożliwia płynne przechodzenie między różnymi widokami w aplikacjach opartych na wzorcu MVVM. Framework Prism oferuje potężne mechanizmy do zarządzania nawigacją, które pomagają w łatwym zarządzaniu widokami, przekazywaniu danych między nimi, a także obsługiwaniu historii nawigacji.
Prism zapewnia wbudowane wsparcie dla nawigacji w aplikacjach WPF (Windows Presentation Foundation), Xamarin, oraz Uno Platform. W tej odpowiedzi skoncentruję się na nawigacji w WPF, ale zasady te można zastosować również w innych platformach wspieranych przez Prism.
Główne elementy nawigacji w Prism 9.0:
INavigationService
: Interfejs do zarządzania nawigacją.INavigationAware
: Interfejs do obsługi cyklu życia widoków podczas nawigacji.- Rejestracja widoków i ViewModeli do nawigacji.
- Wykorzystywanie parametrów w nawigacji.
- Zarządzanie historią nawigacji.
- Zdarzenia związane z nawigacją.
1. INavigationService
– Interfejs nawigacji
INavigationService
to główny interfejs w Prism, który umożliwia zarządzanie nawigacją. Zapewnia funkcje umożliwiające przechodzenie między widokami, powroty do poprzednich widoków, oraz zarządzanie historią nawigacji.
Główne metody INavigationService
:
- Navigate: Przechodzi do innego widoku (np. z
ViewA
doViewB
). - GoBack: Wróć do poprzedniego widoku w historii.
- GoForward: Przechodzi do następnego widoku w historii (jeśli istnieje).
- UriMapping: Umożliwia mapowanie adresów URI do określonych widoków, co przydaje się w bardziej złożonych aplikacjach.
Przykład użycia INavigationService:
using Prism.Navigation;
public class MainViewModel : BindableBase
{
private readonly INavigationService _navigationService;
public MainViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
}
public DelegateCommand NavigateCommand => new DelegateCommand(Navigate);
private async void Navigate()
{
// Nawigacja do nowego widoku
await _navigationService.NavigateAsync("SecondView");
}
}
W tym przykładzie, po kliknięciu przycisku (lub innej akcji), zostanie wywołana metoda Navigate
, która przeprowadza nawigację do widoku o nazwie "SecondView"
. NavigateAsync
to asynchroniczna metoda, która umożliwia asynchroniczne przejście do nowego widoku.
2. INavigationAware
– Interfejs do obsługi cyklu życia widoków
INavigationAware
to interfejs, który może być zaimplementowany w ViewModelu, aby kontrolować reakcję na nawigację. Pozwala to na przygotowanie widoku lub ViewModelu na nawigację (np. ładowanie danych) oraz na wykonanie akcji podczas przejścia między widokami.
Metody INavigationAware
:
- OnNavigatedTo: Jest wywoływana, gdy widok jest ładowany (nawigacja do niego została zakończona).
- OnNavigatingTo: Jest wywoływana, gdy nawigacja do widoku jest w trakcie, ale jeszcze nie zakończona. Można tu sprawdzić, czy można przejść do widoku.
- OnNavigatedFrom: Jest wywoływana, gdy widok zostaje opuściny. Można tu wykonać operacje sprzątania, np. zapisać stan lub zwolnić zasoby.
Przykład implementacji INavigationAware:
using Prism.Navigation;
public class SecondViewModel : BindableBase, INavigationAware
{
private string _message;
public string Message
{
get { return _message; }
set { SetProperty(ref _message, value); }
}
public void OnNavigatedTo(INavigationParameters parameters)
{
// Reakcja na nawigację do widoku
if (parameters.ContainsKey("message"))
{
Message = parameters.GetValue<string>("message");
}
}
public void OnNavigatingTo(INavigationParameters parameters)
{
// Reakcja na rozpoczęcie nawigacji
}
public void OnNavigatedFrom()
{
// Sprzątanie po opuścić widok
}
}
3. Rejestracja widoków i ViewModeli do nawigacji
Prism umożliwia rejestrację widoków w systemie nawigacji, co pozwala na łatwą nawigację między nimi. Rejestracja może być wykonana w kontenerze DI w metodzie RegisterTypes (w klasie App.xaml.cs
).
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Rejestracja View i ViewModel
containerRegistry.RegisterForNavigation<MainPage, MainPageViewModel>();
containerRegistry.RegisterForNavigation<SecondPage, SecondViewModel>();
}
4. Wykorzystywanie parametrów w nawigacji
Nawigacja z parametrami to technika, w której przekazujesz dane między widokami. Parametry mogą być przekazywane do docelowego ViewModelu za pomocą obiektu INavigationParameters
.
Przykład nawigacji z parametrami:
// Przekazanie parametru do widoku
var parameters = new NavigationParameters();
parameters.Add("message", "Hello from MainViewModel!");
await _navigationService.NavigateAsync("SecondView", parameters);
Aby odebrać parametry w ViewModelu docelowego widoku, używamy metody OnNavigatedTo
z interfejsu INavigationAware:
public void OnNavigatedTo(INavigationParameters parameters)
{
if (parameters.ContainsKey("message"))
{
var message = parameters.GetValue<string>("message");
// Używamy parametru
}
}
5. Zarządzanie historią nawigacji
Prism automatycznie zarządza historią nawigacji, dzięki czemu możemy łatwo wracać do poprzednich widoków. Historia ta jest przechowywana w stosie, więc możemy używać metod takich jak GoBackAsync
do powrotu do poprzedniego widoku.
Przykład powrotu do poprzedniego widoku:
public DelegateCommand GoBackCommand => new DelegateCommand(GoBack);
private async void GoBack()
{
// Powrót do poprzedniego widoku
await _navigationService.GoBackAsync();
}
6. Zdarzenia związane z nawigacją
Prism umożliwia obsługę zdarzeń związanych z nawigacją, takich jak rozpoczęcie nawigacji, zakończenie nawigacji, czy nieudana próba nawigacji.
Zdarzenia:
- Navigated: Wywoływane, gdy nawigacja zakończy się pomyślnie.
- Navigating: Wywoływane, gdy nawigacja jest w toku.
- NavigationFailed: Wywoływane, gdy nawigacja się nie powiedzie.
Można je subskrybować i reagować na nie w aplikacji.
Podsumowanie:
W Prism 9.0, nawigacja jest kluczowym elementem zarządzania przejściami między widokami. Framework oferuje prosty, ale elastyczny interfejs INavigationService
do przeprowadzania nawigacji, zarządzania historią oraz przekazywania parametrów między widokami. Dodatkowo, dzięki interfejsowi INavigationAware
, możesz kontrolować cykl życia widoku, reagować na nawigację i odpowiednio przygotować lub posprzątać zasoby.