Define Navigation Routes

UnoFeatures: Navigation (add to <UnoFeatures> in your .csproj)

Register Navigation Views and Routes

private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes)
{
    views.Register(
        new ViewMap(ViewModel: typeof(ShellViewModel)),
        new ViewMap<MainPage, MainViewModel>(),
        new DataViewMap<SecondPage, SecondViewModel, Entity>()
    );

    routes.Register(
        new RouteMap("", View: views.FindByViewModel<ShellViewModel>(),
            Nested:
            [
                new("Main", View: views.FindByViewModel<MainViewModel>()),
                new("Second", View: views.FindByViewModel<SecondViewModel>()),
            ]
        )
    );
}
new DataViewMap<ProductDetailPage, ProductDetailViewModel, Product>()
_navigator.NavigateDataAsync(this, myProduct);

ViewModel constructor must accept the data type parameter.

Request data from navigation

new ResultDataViewMap<ProductsPage, ProductsViewModel, Product>()
var product = await _navigator.GetDataAsync<Product>(this);

Convert query parameters to data

new DataViewMap<ProductDetailPage, ProductDetailViewModel, Product>(
    FromQuery: async (sp, query) =>
    {
        var productService = sp.GetRequiredService<IProductService>();
        var id = query[nameof(Product.Id)];
        return await productService.GetById(id, default);
    }
)

Convert data to query parameters

new DataViewMap<ProductDetailPage, ProductDetailViewModel, Product>(
    ToQuery: product => new Dictionary<string, string>
    {
        { nameof(Product.Id), $"{product.Id}" }
    }
)

Define nested routes

routes.Register(
    new RouteMap("", View: views.FindByViewModel<ShellViewModel>(),
        Nested:
        [
            new("Login", View: views.FindByViewModel<LoginViewModel>()),
            new("Main", View: views.FindByViewModel<MainViewModel>(),
                Nested:
                [
                    new("ForYouTab"),
                    new("FavoritesTab")
                ]
            )
        ]
    )
);

Set default nested route

new RouteMap("Main", View: views.FindByViewModel<MainViewModel>(),
    Nested:
    [
        new("ForYouTab", IsDefault: true),
        new("FavoritesTab")
    ]
)

Automatically navigates to the default route when parent view is displayed.

Redirect based on conditions

new("Main", View: views.FindByViewModel<MainViewModel>(),
    Init: (request) => 
    {
        if (!User.IsLoggedIn())
        {
            request = request with { Route = Route.PageRoute("Login") };
        }
        return request;
    }),