2010-10-28 10 views
3

Je suis nouveau sur Silverlight et j'ai de la difficulté à comprendre comment naviguer correctement entre les pages, en particulier lorsque j'ai besoin de transmettre des données.Comment effectuer une navigation dans Silverlight 4.0 à l'aide de MVVM?

Exemple classique: J'ai une liste de personnes sur une page, et quand je clique sur une personne dans la grille de données, je voudrais aller à la page des détails et charger ces données. Je dois passer le PersonId. Plus important encore, j'ai besoin de savoir comment faire cela à partir du ViewModel.

Il est facile de lancer une commande à partir de la grille de données qui se trouve sur le ViewModel, et le SelectedItem sur le viewmodel est également lié et donc suivi, mais quoi? Comment puis-je accéder à la page suivante? Je ne peux pas pour la vie de moi comprendre celui-ci. Cela semble que ça devrait être vraiment facile, mais jusqu'ici ça a été tout sauf facile.

+0

Avez-vous déjà regardé les fonctionnalités de navigation dans Silverlight (http://msdn.microsoft.com/fr-fr/library/cc838245(VS.95).aspx) Utilisez-vous MVVM ou utilisez-vous quelque chose comme Prism aussi bien? – Murven

+0

Seulement en utilisant MVVM Murven. J'ai plus ou moins compris cela. Semble que je dois soit injecter le NavigationService dans le ViewModel de la vue, ou je dois renvoyer un événement du ViewModel à la vue afin qu'il puisse déclencher l'appel au NavigationService. Mais de toute façon cela fonctionne. –

Répondre

0

La chose la plus élémentaire à faire serait de changer ce que Application.Current.RootVisual est réglé à et définir le DataContext approprié. Cependant, il est préférable d'avoir des wrappers qui configurent cela correctement pour vous. Par exemple, dans votre vue personnalisée, vous pouvez faire en sorte que le constructeur de la vue gère une partie de cette logique pour vous de manière plus agréable. Si vous utilisez Prism, vous parlez de modifier le shell ou un conteneur dans le shell.

+0

En fait, une fois qu'il est défini, Application.Current.RootVisual ne peut pas être modifié, mais l'idée que vous essayez de transmettre est tout à fait correcte. – Murven

0

Dans SelectedItemChanged, vous pouvez définir une propriété ViewModel "SelectedItem" avec l'objet dont vous avez besoin dans l'autre page. Vous ViewModel devrait être un singleton. Dans l'autre page, vous devez avoir le DataContext défini sur le ViewModel et maintenant vous pouvez lier le SelectedItem au contrôle que vous voulez. La seule chose que je n'aime pas, c'est que vous devriez toujours aller au code derrière la page de démarrage, obtenir l'objet SelectedItem du DataGrid et définir le ViewModel avec cette valeur.