Mvvm Light : IoC et Navigation 11

Pour ceux qui utilisent MvvmLight, avez-vous déjà jeté un œil à la version beta de la v4 (MvvmLight Preview) disponible depuis Septembre 2011? Si l’intégration de CommonServiceLocator n’était pas passée inaperçue, le model applicatif de la mise en place de votre architecture se simplifie du coup énormément.

ViewModelLocator

Dans la version 3 de MvvmLight, dans le ViewModelLocator, il fallait créer une instance statique de son ViewModel que l’on rattachait à une propriété publique. On s’y prenait de la façon suivante :

private static MainViewModel _main;
 
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
      _main = new MainViewModel();
}
 
public MainViewModel Main
{
     get
     {
          return _main;
     }
}

Maintenant, grâce à l’utilisation de SimpleIoc, il suffit d’initialiser le container dans le constructeur du ViewModelLocator :

ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

D’enregistrer ses ViewModel avec le container :

SimpleIoc.Default.Register<MainViewModel>();

Et de récupérer leur instance de cette façon :

public MainViewModel Main
{
     get {
     	return ServiceLocator.Current.GetInstance<MainViewModel>();
     }
}

A propos de la navigation

Grâce à SimpleIoc, pour utiliser la navigation au sein de ses applications, cela devient du coup plus simple. Il n’est plus nécessaire d’avoir à utiliser un système basé sur des Messenger ou alors de surcharger les constructeurs de nos ViewModel afin de leur passer une instance de INavigationService initialisée dans le ViewModelLocator. On procédèra ainsi :

Dans le ViewModelLocator :

public ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    SimpleIoc.Default.Register<INavigationService, NavigationService>();
 
    if (ViewModelBase.IsInDesignModeStatic) {
        // Create design time view services and models
        //SimpleIoc.Default.Register<IDataService, DesignDataService>();
     }
     else {
         // Create run time view services and models
         //SimpleIoc.Default.Register<IDataService, DataService>();
         SettingsRegistration.Register();
         InitializeModels();
     }
}

Et pour pouvoir l’utiliser dans nos ViewModel :

private INavigationService _NavigationService;
_NavigationService = SimpleIoc.Default.GetInstance<INavigationService>();

Un exemple simple se trouve ici.

Bon courage (^_^) !

  • Edlias

    I posted about implementing MVVM Light with Structure Map using the Common Service Locator Support: http://www.codeproject.com/KB/aspnet/DemoStructMapMVVMLightPkg.aspx

  • Edlias

    I posted about implementing MVVM Light with Structure Map using the Common Service Locator Support: http://www.codeproject.com/KB/aspnet/DemoStructMapMVVMLightPkg.aspx

  • Nice article and great to know! Thank you Edlias !

    • Edlias

      David, j’ai essayé de faire un demo avec MVVM Light qui ressemble un demo de Caliburn Micro que j’ai trouvé ici: http://baud.cz/blog/coproject-ria-caliburnmicro-demo-part-3, mais je trouve que c’est vrm difficle definir unse section dans une fenêtre dont laquelle j’affiche un user control selon le model actif, as-tu fait quelque chose comme ça? J’ai pensé par exemple de créer une classe ViewModelBinder pour enregistrer les correspondences entre le modèle et la vue. Si tu as une idée fait moi savoir STP.

      Merci

      • Alors, j’ai une solution à te proposer avec Mvvm Light. Je continue de la tester et je vais bloguer dessus cette semaine ! A plus tard (^__^).

  • Nice article and great to know! Thank you Edlias !

    • Edlias

      David, j’ai essayé de faire un demo avec MVVM Light qui ressemble un demo de Caliburn Micro que j’ai trouvé ici: http://baud.cz/blog/coproject-ria-caliburnmicro-demo-part-3, mais je trouve que c’est vrm difficle definir unse section dans une fenêtre dont laquelle j’affiche un user control selon le model actif, as-tu fait quelque chose comme ça? J’ai pensé par exemple de créer une classe ViewModelBinder pour enregistrer les correspondences entre le modèle et la vue. Si tu as une idée fait moi savoir STP.

      Merci

      • Alors, j’ai une solution à te proposer avec Mvvm Light. Je continue de la tester et je vais bloguer dessus cette semaine ! A plus tard (^__^).

  • Emilien

    Bonjour,

    Es ce qu’il serait possible de corriger le lien avec l’exemple? Car il ne fonctionne plus.

    Merci d’avance.
    Emilien

  • François Morin

    Bonjour David,

    Merci pour cet article! Exactement ce que je cherchais… 😀
    Le lien pour downloader l’exemple n’est plus valide (Nothing found).
    Pourrais tu le mettre à jour?

    Merci!

    François

    • Bonjour François, je te réponds avec beaucoup de retard, mais tu as pu t’en sortir ? A défaut, je pourrai te refaire un nouvel exemple (j’ai “perdu les anciennes sources”). Dav