2010-04-19 2 views
6

J'ai la question suivante concernant la lumière MVVM: qu'est-ce qui "pilote" l'interface utilisateur? Je vois que je peux avoir un ViewModel par vue que je montre; le ViewLocator gère tous les ViewModels (pour la mise en cache si je comprends bien). Mais qu'est-ce qui motive l'interface utilisateur?Ai-je besoin d'un contrôleur de vue pour MVVM-light dans Silverlight?

Si j'ai une commande définie dans mon ViewModel qui dit "ShowDetail"; dois-je écrire le code pour afficher cette vue dans le ViewModel?

Y a-t-il des exemples? Merci!

Répondre

1

Dans MVVM, ce qui "pilote" la vue est la liaison de données. Vous pouvez connecter View à ViewModel en définissant le DataContext de View pour pointer vers le modèle de vue.

exemple simple (en utilisant MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase 
{ 
    (...) 
    private string _myProperty; 
    public string MyProperty { 
     get { return _myProperty; } 
     set { 
      _myProperty = value; 
      RaisePropertyChanged("MyProperty"); 
     } 
    } 
} 

MyView.xaml.cs

void MyView() { 
    DataContext = new MyViewModel(); 
} 

MyView.xaml

<TextBlock Text="{Binding MyProperty}" /> 
+1

Mes questions étaient plus liées au chargement de différentes vues. Je comprends le mécanisme de liaison avec un ViewModel. Mais où puis-je écrire du code pour afficher une nouvelle vue lorsque l'utilisateur exécute par exemple le bouton "Afficher les détails"? –

5

Le MVVM modèle par lui-même n'a pas ha Quelque chose de spécifique à la navigation entre les vues. Bien que, il existe de nombreuses solutions pour cela dans plusieurs cadres. La solution la plus courante consiste à utiliser une sorte de contrôleur qui «orchestre» la vue principale ou à utiliser une approche «maître-détail» pour les sous-vues.

Quelques solutions intéressantes:

1

J'ai créé un template T4 tha t génère du code et montre comment naviguer vers un uri ou un objet, ou ferme une fenêtre (wpf). Il fonctionne avec la lumière MVVM

Download here

0

Je pense que vous pouvez vérifier Cinch V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

qui semble calme prometteur. Cependant, je pense que la plupart de ces cadres sont assez difficiles.

J'ai mis en œuvre une solution avec une approche MVVM simple avec un certain type de modèle de contrôleur de supervision qui gère la communication entre les vues et les vues-modèles.

0

Je vous recommande de lire le système de messagerie dans la boîte à outils MVVM. Cela semble être l'approche la plus simple que j'ai trouvée pour accomplir ceci.Voici un exemple de la façon dont cela fonctionne:

Si vous avez 2 modèles de vue - 1 pour les clients à la recherche, l'autre pour afficher les détails sur le client sélectionné:

Dans le premier modèle de vue, vous avez une propriété telle que ceci:

public string CustomerID 
    { 
     get 
     { 
      return _customerid; 
     } 

     set 
     { 
      if (_efolderid == value) 
      { 
       return; 
      } 

      var oldValue = _customerid; 
      _customerid = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      RaisePropertyChanged("CustomerID", oldValue, value, true); 
     } 
    } 

Ensuite, dans le deuxième modèle de vue, vous inscrire pour recevoir des messages lorsque cette valeur change de l'autre, comme cela:

void registerForMessages() 
    { 
     Messenger.Default.Register<PropertyChangedMessage<string>>(this, 
      (pcm) => 
      { 
       if (pcm.PropertyName == "CustomerID") 
       { 
        customerID = pcm.NewValue; 
        AddWorkplanCommand.RaiseCanExecuteChanged(); 
        loadCustomerDetails(); 
       } 
      }); 
    } 

Be Assurez-vous d'appeler votre fonction registerForMessages() dans le constructeur du deuxième modèle de vue. Une autre chose qui aide est de créer une carte de sortes quand vous avez 4 ViewModels ou plus dans votre application. Je trouve qu'il est facile d'en construire un dans un fichier texte rapide dans la solution pour garder une trace de tous les messages et de ce qu'ils sont destinés à accomplir, et quels autres modèles de vue sont enregistrés pour les recevoir. L'une des choses vraiment intéressantes à ce sujet est que vous avez 1 viewmodel envoyer une notification de modification, comme la propriété customerID a changé, et immédiatement 4 autres viewmodels reçoivent cette modification et tous les changements de chargement commencent eux-mêmes.

Questions connexes