2011-07-07 5 views
4

J'ai appris le modèle MVVM avec Josh Smith's article et je veux créer une mise en page classique avec des liens vers la droite (gérés avec des commandes) alors quand je clique sur un, je peux afficher ma vue à droite dans un contrôle onglet (à l'intérieur il y a un ContentControl).Lier dynamiquement des vues dans un ContainerControl avec MVVM

Ceci est simple lorsque j'utilise un DataTemplate avec les View et ViewModel spécifiques que je veux montrer à l'écran comme ceci.

<!-- this section into my MainWindow's resources file --> 
<DataTemplate xmlns:vm='clr-namespace:WpfFramework.ViewModels' 
       xmlns:vw='clr-namespace:WpfFramework.Views' 
       DataType="{x:Type vm:MySpecificViewModel }" >   
    <vw:MySpecificView /> 
</DataTemplate> 

Mais, je veux quelque chose de plus générique. Je veux dire que mon mainWindow ne devrait pas connaître une vue spécifique ni un ViewModel spécifique. Il devrait seulement savoir qu'il se lie à certaines commandes et a un contrôle de tabulation qui montre "une certaine vue". Chaque échantillon incluant Josh Smith's article semble avoir un univers limité de vues et de viewmodels, c'est génial avec un échantillon. Alors, comment puis-je dire à mon ContentControl qu'une vue (avec son viewModel correspondant) va être là sans être si spécifique (sans "brûler" dans la mainVoir les types concrets)?

meilleures salutations Rodrigo

PD. J'ai essayé avec base un ViewModel et une vue de base mais cela ne semble pas fonctionner.

Répondre

3

Dans votre principale vue, lier un ContentControl à une propriété ViewModelBase générique

<ContentControl Content="{Binding CurrentPage}" /> 

CurrentPage serait défini dans la principale ViewModel comme un objet ViewModelBase, et pour changer de page vous suffit de définir CurrentPage à ce que vous voulez.

Ainsi, lorsque vous cliquez sur quelque chose comme le HomePageCommand, le principal ViewModel exécuterait CurrentPage = new HomePageViewModel(); prévoyant que HomePageViewModel hérite de ViewModelBase.

j'ai écrit quelque chose d'un peu de temps il y a quelques exemples qui montre here si vous êtes intéressé

+0

Salut Rachel, merci pour la suggestion (en passant, pourriez-vous corriger votre lien?). J'ai essayé cela mais je ne peux pas comprendre comment je peux relier un HomePageViewModel avec son HomePageView correspondant? –

+0

@Rodrigo Vous le faites correctement dans votre question. Dans vos ressources d'application, définissez les modèles de données qui mappent chaque ViewModel à une vue spécifiée. Habituellement, je mets les mappages dans App.xaml sous ''. Une autre alternative consiste à placer les DataTemplates dans un ResourceDictionary et à charger ResourceDictionaries dans MergedDictionaries de l'application lors de l'exécution. J'utilise cette méthode si ResourceDictionaries est chargé dynamiquement ou s'ils existent dans d'autres DLL. (J'ai aussi corrigé le lien) – Rachel

+0

J'ai une question sur [votre exemple] (http://rachel53461.wordpress.com/2011/05/28/switching-between-viewsusercontrols-using-mvvm/). Y a-t-il une vue impliquée? Je veux dire que si j'ai 300 vues, suis-je censé expliciter ce balisage sur mon mainView? –

Questions connexes