Git Product home page Git Product logo

mvvm.navigation's Introduction

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))]
  1. 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 mvvm:Properties.Navigator="{Binding Navigator}"/>
</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:Properties.ViewModel and mvvm:Properties.ServiceProvider/mvvm:Properties.Navigator(includes ServiceProvider) attached dependency properties.

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

mvvm.navigation's People

Contributors

dependabot[bot] avatar havendv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

mvvm.navigation's Issues

Question about generated AddViewsAndViewModels AddMappedViewsAndViewModels(IServiceCollection services)

Hello,
I am trying to add the navigation to a new project using Avalonia UI. (I also need log and other things, DI)
I noticed the preprepared calls for
AddViewsAndViewModels and AddMappedViewsAndViewModels and it looks, they are somehow generated.
Among the others, I am referencing NuGet package Mvvm.Navigation.Avalonia" Version="1.4.5", CommunityToolkit.Mvvm" Version="8.2.2"

What are the rules (conventions) for triggering that code generation of that ServiceCollectionExtensions?

If it somehow helps ,In more detail - my "testing" code App.axaml.cs is as following:

private IHost Host { get; } = Microsoft.Extensions.Hosting.Host .CreateApplicationBuilder() .AddMvvmNavigation() .Build();
//public App() //{ // var builder = Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder(); // Services = builder.Services; // Host = builder.AddMvvmNavigation().Build(); //}
`
public readonly ServiceCollection Services = new ServiceCollection();
public ServiceProvider ServiceProvider { get; set; }

public override void Initialize()
{

    Services.AddLogging(loggingBuilder =>
      {
          // configure Logging with NLog
          loggingBuilder.ClearProviders();
          loggingBuilder.SetMinimumLevel(LogLevel.Trace);
          loggingBuilder.AddNLog();
      });

    Services.AddSingleton<ViewLocator>(ViewLocator.Instance);
    Services.AddSingleton<IPlatformService, DesktopPlatformService>();
    Services.AddSingleton<IMessageService, NotificationMessageService>();


#if DEBUG
Ioc.Default.ConfigureServices(Host.Services);
#endif
AvaloniaXamlLoader.Load(this);
`
(please excuse me for wrongly formated above code)

(unfortunatelly have to continue with registration in OnAttachedToVisualTree of the MainView, because one ctor parameter of the
MainViewModel needs notification service initialized with following parameter)

var notificationManager = new WindowNotificationManager(TopLevel.GetTopLevel(this));

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.