Pillar, a MVVM framework for Xamarin Forms

Pillar is a MVVM framework for Xamarin.Forms 1.x and 2.x. It includes a ViewModel first navigation system and many more cool features.

This post was originally published in 2016 and may contain outdated information.

I’m proud to annonce the release of Pillar, a lightweight MVVM framework for Xamarin.Forms 1.x and 2.x. With this framework, you won’t have to deal with page navigation or messed up code-behind anymore. Now, it’s all about view models, and navigation between view models. It rely on Autofac for dependency injection and MvvmLight for basic MVVM features and helper classes.

Features included in Pillar:

  • ViewModel navigation, you won’t need to manipulate pages in your view models
  • Design your apps with unit testing in mind with dependency injection
  • Flexible, you can use differents patterns: ViewModel first, Messaging, ViewModelLocator
  • EventToCommand behavior and useful converters included
  • Useful views: ItemsView repeater, with optional DataTemplate selector by item type
  • Not intrusive, you can reuse your view models in other projects (WPF for example) with very few modifications

Getting started

You can install Pillar with the Nuget package manager:

Install-Package Askaiser.Mobile.Pillar

You will find the documentation and samples on the GitHub repository.

Quick example

Setup and configuration:

public class MyAppBootstrapper : PillarBootstrapper
{
    private readonly Application _app;

    public MyAppBootstrapper(Application app)
    {
        _app = app;
    }
    
    protected override void ConfigureContainer(ContainerBuilder builder)
    {
        base.ConfigureContainer(builder);

        builder.RegisterType<FirstViewModel>();
        builder.RegisterType<FirstView>();
        
        builder.RegisterType<SecondViewModel>();
        builder.RegisterType<SecondView>();
    }
    
    protected override void RegisterViews(IViewFactory viewFactory)
    {
        viewFactory.Register<FirstViewModel, FirstView>();
        viewFactory.Register<SecondViewModel, SecondView>();
    }
    
    protected override void ConfigureApplication(IContainer container)
    {
        var viewFactory = container.Resolve<IViewFactory>();
        var page = viewFactory.Resolve<FirstViewModel>();

        _app.MainPage = new NavigationPage(page);
    }
}

public class App : Application
{
    public App()
    {
        new MyAppBootstrapper(this).Run();
    }
}

Your first ViewModel:

public class FirstViewModel : PillarViewModelBase
{
    private readonly INavigator _navigator;

    public FirstViewModel(INavigator navigator)
    {
        _navigator = navigator;

        // Go to the second view after 5 seconds
        GoToSecondViewModel();
    }

    public async void GoToSecondViewModel()
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
        await _navigator.PushAsync<SecondViewModel>();
    }
}
Licensed under CC BY 4.0
Ko-fi donations Buy me a coffee