Skip to main content
net8.0net8.0-android34.0net8.0-ios17.2net8.0-maccatalyst17.2net8.0-tizen8.0net8.0-windows10.0.19041

Provides platform independent navigation at the MVVM level and a Source Generator that automatically binds view and view models and registers this in your DI container ⭐ Last 10 features: - feat: Updated packages. 2024-03-04 - feat: Moved View resolving to Navigator. 2024-03-04 - feat: Changed default DI scopes. 2024-03-04 - feat: Enable Trimming warnings. 2024-03-04 - feat: Replaced Resolver with ServiceProvider extension. 2023-12-03 - feat: Released 1.3.0. 2023-12-01 - feat(apps): Updated Uno app. 2023-11-30 - feat: Updated to net8.0. 2023-11-08 - feat: Added BeforeInitializeComponent/AfterInitializeComponent partial methods when generating constructors. Fixed ViewModel init order. 2023-09-14 - feat: Now you can implement IActivatable for window/control and it will work. 2023-09-14 🐞 Last 10 bug fixes: - fix: Disabled HostBuilderExtensions generation if detected framework is none. 2024-03-05 - fix: Added TryDetectFramework instead DetectFramework. 2024-03-04 - fix: Renamed mvvm:Properties to mvvm:Navigation. 2024-03-04 - fix: Fixed some warnings. 2023-12-18 - fix: Fixed problems with Uno.WinUI. 2023-12-04 - fix: Added GenerateLibraryLayout. 2023-12-04 - fix: Try to use latest DependencyPropertyGenerator. 2023-12-04 - fix: Fixed broken DependencyPropertyGenerator version. 2023-12-04 - fix: Fixed problems with Avalonia. 2023-12-04 - fix: Properties now is static class. 2023-12-04

Published
Mar 5, 2024
2y ago
Total Downloads
10.7K
10,723

Deprecated Package Version

Reason: Legacy

Install

dotnet add package Mvvm.Navigation.Maui --version 1.5.1
ProductVersions
.NET
net8.0net8.0-android34.0net8.0-ios17.2net8.0-maccatalyst17.2net8.0-tizen8.0net8.0-windows10.0.19041

README

Mvvm.Navigation

CI/CD License: MIT Discord NuGet NuGet NuGet NuGet NuGet NuGet NuGet NuGet

Provides platform independent navigation at the MVVM level and a Source Generator that automatically binds view and view models and registers this in your DI container.

🔥Features🔥

  • Uses DI to resolve your view from view model.
  • Generates constructors for your views(optional).
  • Generates an extension method for you with all your Views and ViewModels to register them in DI.
  • Does not contain custom controls, everything happens based on the attached dependency property and does not limit the user.
  • Allows forward/backward navigation like in Chrome.
  • Allows you to receive activation/deactivation events - just implement IActivatableViewModel for your ViewModel.
  • Allows you to generate a typed ViewModel property via an attribute, bound to your BindingContext and initialized from DI.
  • Supports automatic mapping between View and ViewModel based on a global attribute.
  • Allows case-by-case, attribute-based control for Views.

Usage

  1. Add .AddMvvmNavigation() call to your Host builder or IServiceCollection:
public sealed partial class App
{
    public App()
    {
        AppHost = Host
            .CreateDefaultBuilder()
            .AddMvvmNavigation()
            .Build();
    }
}
  1. Add ViewFor attribute to your views:
using Mvvm.Navigation;

[ViewFor<MainViewModel>]
public partial class MainPage : UserControl;

or assembly level attribute(nameof behavior is ignored and the full namespace is taken):

[assembly:MapViews(
    viewsNamespace: nameof(MyNamespace.Views),
    viewModelsNamespace: nameof(MyNamespace.ViewModels))]

or in .csproj:

<ItemGroup Label="Navigation">
    <AssemblyAttribute Include="Mvvm.Navigation.MapViews">
        <_Parameter1>nameof(MyNamespace.Views)</_Parameter1>
        <_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
        <_Parameter2>nameof(MyNamespace.ViewModels)</_Parameter2>
        <_Parameter2_IsLiteral>true</_Parameter2_IsLiteral>
        <ViewLifetime>Mvvm.Navigation.ServiceLifetime.Transient</ViewLifetime>
        <ViewLifetime_IsLiteral>true</ViewLifetime_IsLiteral>
        <ViewModelLifetime>Mvvm.Navigation.ServiceLifetime.Scoped</ViewModelLifetime>
        <ViewModelLifetime_IsLiteral>true</ViewModelLifetime_IsLiteral>
    </AssemblyAttribute>
</ItemGroup>

Default lifetime is ServiceLifetime.Transient for View and ServiceLifetime.Scoped for ViewModel. 3. Add Navigator to your ViewModel:

public Navigator<ObservableObject> Navigator { get; }
  1. Add commands to your views(or just use Navigator from ViewModel):
<Grid>
    <Button
        Command="{Binding Navigator.NavigateByTypeCommand}"
        CommandParameter="{x:Type viewModels:BlueViewModel}"
        />
    <ContentControl Content="{Binding Navigator.CurrentView}"/>
</Grid>

Tip: you can use CommandParameter="{mvvm:Type Type=viewModels:BlueViewModel}" for WinUI/UWP/Uno platforms.

Base

The library was written as a replacement for ReactiveUI in a real project, and inherits some concepts from it, excluding reactivity.
If you have the same task, then the changes are as follows:

  • Replace RoutingState with Navigator
  • Replace IScreen with INavigable
  • Replace ReactiveUserControl with UserControl
  • Replace ReactiveWindow with Window
  • Replace RoutedViewHost and ViewModelViewHost with ContentControl
  • Use mvvm:Navigation.ViewModel and mvvm:Navigation.Navigator(includes ServiceProvider) attached dependency properties.
  • Or just bind like this <ContentControl Content="{Binding Navigator.CurrentView}"/>

Support

Priority place for bugs: https://github.com/HavenDV/Mvvm.Navigation/issues
Priority place for ideas and general questions: https://github.com/HavenDV/Mvvm.Navigation/discussions
I also have a Discord support channel:
https://discord.gg/g8u2t9dKgE

Changes from Previous Version

No structural changes between v1.5.0 and v1.5.1.

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

NuGet marks this package as deprecated. Review the publisher's migration guidance before adopting it.Compatibility metadata lists 6 target frameworks; confirm the exact target used by your application.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.