• Home
  • Documentation
Show / Hide Table of Contents
  • Introduction
  • Getting Started
    • Download and Setup Prism
    • NuGet Packages
    • Productivity Tools
  • Commands
    • Commanding
    • Composite Commands
  • Dependency Injection
    • Getting Started
    • Registering Types
    • Platform Specific Services
    • Exception Handling
    • ContainerLocator
    • Adding a Custom Container
    • Appendix
  • Event Aggregator
  • ViewModelLocator
  • Modules
  • WPF / Uno
    • Introduction
    • Getting Started
    • Converting From Prism 7.x
    • Converting From Prism 6.x
    • View Composition
    • Region Navigation
      • About Navigation in Prism
      • Basic Region Navigation
      • View/ViewModel Participation
      • Navigating to Existing Views
      • Passing Parameters
      • Confirming Navigation
      • Controlling View Lifetime
      • Navigation Journal
    • Interactivity
      • Event To Command
    • Dialog Service
    • Advanced
      • Region Adapters
    • Legacy (Prism 6)
      • Introduction
      • Initializing
      • Managing-Dependencies
      • Modules
      • Implementing-MVVM
      • Advanced-MVVM
      • Composing-the-UI
      • Navigation
      • Communication
      • Deploying
      • Appendix-A-Glossary
      • Appendix-B-Patterns
      • Appendix-C-Prism-Library
      • Appendix-D-Extending-Prism
      • Appendix-E-Click-Once
  • .NET MAUI
    • Getting Started
    • Migrating from Prism.Forms
    • PrismAppBuilder
    • Dependency Injection
    • AppModel
      • IPageLifecycleAware
    • Behaviors
      • Introduction
      • BehaviorBase<T>
      • EventToCommandBehavior
      • PageBehaviorFactory
    • Dialogs
      • Getting Started
      • IPageDialogService
      • IDialogService
    • Navigation
      • Introduction
      • Page Navigation
      • NavigationBuilder
      • Understanding the INavigationResult
      • NavigationExceptions
      • Global Navigation Observer
      • XAML Navigation
    • Regions
      • Introduction
  • Xamarin.Forms
    • Create Your First App
    • Behaviors
      • Working with Behaviors
      • EventToCommand Behavior
      • PageBehaviorFactory
    • Dialogs
      • Dialogs
      • Page Dialog Service
      • Dialog Service
      • Styling Dialogs
    • Navigation
      • Navigation Basics
      • Passing Parameters
      • Confirming Navigation
      • Deep Linking
      • Working w/ MasterDetailPages
      • Working w/ NavigationPages
      • Working w/ TabbedPages
      • XAML Navigation
    • Application Lifecycle
    • Page Lifecycle
    • Additional Platforms
      • GTK

Passing parameters

The Prism navigation service also allows you to pass parameters to the target view during the navigation process. Passing parameters to the next View can be done using an overload of the INavigationService.NavigateAsync method. This overload accepts a NavigationParameters object that can be used to supply data to the next View. The NavigationParameters object is in fact just a dictionary. It can accept any arbitrary object as a value.

Creating Parameters

Creating parameters can be done in a variety of ways.

var navigationParams = new NavigationParameters
{
    { "model", new Contact() }
};
_navigationService.NavigateAsync("MainPage", navigationParams);

You can also create an HTML query string to generate your parameter collection.

var queryString = "code=CR&desc=Red";
var navigationParams = new NavigationParameters(queryString);
_navigationService.NavigateAsync("MainPage", navigationParameters);

When using a short-syntax to navigate, you may append the navigation key with parameters, which will be used as the navigation parameters.

//query string
_navigationService.NavigateAsync("MainPage?id=3&name=brian");

//using NavigationParameters in short-syntax
_navigationService.NavigateAsync("MainPage" + navParameters.ToString());

//using both short-syntax parameters and NavigationParameters
var navParameters = new NavigationParameters
{
    { "name", "brian" }
};
_navigationService.NavigateAsync("MainPage?id=3", navParameters);

When using a Uri-syntax to navigate, you may append the Uri with parameters, which will be used as the navigation parameters.

//query string
_navigationService.NavigateAsync(new Uri("MainPage?id=3&name=brian", UriKind.Relative));

//using NavigationParameters in Uri
_navigationService.NavigateAsync(new Uri("MainPage" + navParameters.ToString(), UriKind.Relative));

//using both Uri parameters and NavigationParameters
var navParameters = new NavigationParameters
{
    { "name", "brian" }
};
_navigationService.NavigateAsync(new Uri("MainPage?id=3", UriKind.Relative), navParameters);

Getting Parameters

Getting the parameters that were passed to the target View being navigated to can be achieved by using the INavigationAware interface on the corresponding ViewModel.

INavigationAware

The ViewModel of the target navigation Page can participate in the navigation process by implementing the INavigationAware interface. This interface adds two methods to your ViewModel so you can intercept once it is navigated to (OnNavigatedTo), and once it is navigated away from (OnNavigatedFrom). These methods make the NavigationParameters accessible from either the View being navigated to, or the View being navigated away from.

Note: You can implement INavigationAware on either the View or ViewModel

Example:

public class ContactPageViewModel : INavigationAware
{
    public void OnNavigatedTo(INavigationParameters parameters)
    {

    }

    public void OnNavigatedFrom(INavigationParameters parameters)
    {

    }
}

ViewModel Initialization

Prism.Forms has two options for handling ViewModel initialization. This is the processing of NavigationParameters BEFORE the View is navigated to. It is important to remember that Initialization only occurs once when the View is being navigated to for the first time.

For most use cases you will want to use IInitailize to ready your ViewModel as it is navigated to.

public interface IInitialize
{
    void Initialize(INavigationParameters parameters);
}

Similar to INavigationAware we will pass in the NavigationParameters to be evaluated and make our ViewModel ready.

Many times you may however find that you need to do something asynchronously. This could be an API call, or you may be using an async API to access a Sqlite Database locally. Whatever your issue is it can sometimes be desireable to have an async API to work with. For this reason Prism also has added the IInitializeAsync interface.

public interface IInitializeAsync
{
    Task InitializeAsync(INavigationParameters parameters);
}
Warning

.NET Developers have an over reliance on async Task without understanding what that will mean. Any delay caused by the Navigation Service awaiting InitializeAsync WILL result in delay in UI Navigation. While this may be the desired effect, if you do not architect your app properly this will result in a poor user experience as it may appear that the UI is unresponsive. You should NEVER use this on the initial navigation when your app starts.

Reading Parameters

Now that you have access to the parameters, you must read the parameters from the available NavigationParameters instance. There are two ways to read parameters; by using the parameter key as an indexer on the parameters instance, or by using the GetValue/GetValues method on the parameters instance.

public void OnNavigatedTo(INavigationParameters parameters)
{
  //get a single typed parameter
  var color = parameters.GetValue<Color>("color");

  //get a collection of typed parameters
  var colors = parameters.GetValues<Color>("colors");
}

Get the NavigationMode

When navigating, it is sometimes important to know which direction you are heading in the navigation stack. This allows you to make different decisions based on if you are navigating forward or back.

To get the NavigationMode, simply call the INavigationParameters.GetNavigationMode method.

public void OnNavigatedFrom(INavigationParameters parameters)
{
  var navigationMode = parameters.GetNavigationMode();
}

Prism for Xamarin.Forms only support two NavigationMode options:

    public enum NavigationMode
    {
        /// <summary>
        /// Indicates that a navigation operation occurred that resulted in navigating backwards in the navigation stack.
        /// </summary>
        Back,
        /// <summary>
        /// Indicates that a new navigation operation has occurred and a new page has been added to the navigation stack.
        /// </summary>
        New,
    }
Note

NavigationMode.Forward and NavigationMode.Refresh are not supported in Xamarin.Forms. These are used in UWP only.

  • Edit on GitHub
  • Ask questions
  • Follow @PrismLib
  • Follow @BrianLagunas
  • Follow @DanJSiegel
Back to top Copyright 2015-2022 Prism