Exemple # 1: J'ai une vue affichée dans mon application MVVM (utilisons Silverlight pour les besoins de la discussion) et je clique sur un bouton qui devrait m'amener à une nouvelle page.
Exemple # 2: Cette même vue possède un autre bouton qui, lorsque vous cliquez dessus, devrait ouvrir une vue détaillée dans une fenêtre enfant (boîte de dialogue).
Nous savons qu'il y aura des objets Command exposés par notre ViewModel lié aux boutons avec des méthodes qui répondent au clic de l'utilisateur. Mais alors quoi? Comment terminons-nous l'action? Même si nous utilisons un soi-disant NavigationService, que disons-nous?
Pour être plus précis, dans un modèle View-first traditionnel (comme les schémas de navigation basés sur des URL comme sur le Web ou le cadre de navigation intégré SL), les objets Command devraient savoir quelle vue afficher ensuite. Cela semble franchir la ligne quand il s'agit de la séparation des préoccupations promues par le modèle.
D'un autre côté, si le bouton n'était pas connecté à un objet Command et se comportait comme un lien hypertexte, les règles de navigation pouvaient être définies dans le balisage. Mais voulons-nous que les vues contrôlent le flux des applications et la navigation n'est-elle pas simplement un autre type de logique métier? (Je peux dire oui dans certains cas et non dans d'autres.)
Pour moi, l'implémentation utopique du modèle MVVM (et j'en ai entendu d'autres professer cela) consisterait à câbler le ViewModel de manière à ce que l'application puisse fonctionner sans tête (c'est-à-dire sans vues). Cela fournit la plus grande surface pour les tests basés sur le code et fait des vues un véritable habillage sur l'application. Et mon ViewModel ne devrait pas se soucier s'il s'affiche dans la fenêtre principale, un panneau flottant ou une fenêtre enfant, n'est-ce pas?
Selon cette approbation, il appartient à un autre mécanisme au moment de l'exécution de «lier» quelle vue doit être affichée pour chaque ViewModel. Mais que se passe-t-il si nous voulons partager une vue avec plusieurs ViewModels ou vice versa?
Donc, étant donné la nécessité de gérer la relation View-ViewModel afin que nous sachions quoi afficher quand ainsi que la nécessité de naviguer entre les vues, y compris l'affichage des fenêtres / boîtes de dialogue enfants, comment pouvons-nous vraiment accomplir cela dans le modèle MVVM?