2011-01-10 6 views
1

Ceci est ma première tentative de MVVM. Le noyau de mon application est vaguement basé sur l'article msdn de Josh Smith. Et j'utilise aussi le framework light mvvm.wpf mvvm passer des paramètres entre viewmodels en utilisant les commandes

J'ai une fenêtre principale contenant une zone de liste de commandes et une zone d'espace de travail qui affiche les commandes/vues sous forme de tabulations, chaque commande usercontrol a un modèle de vue correspondant. MainWindow a également un viewmodel contenant ma liste de commandes, et les viewmodels d'espace de travail ont un viewmodel d'espace de travail de base.

Ma vue par défaut a une grille de données principale, de MappingSets, qui peut avoir un élément sélectionné. Les commandes lancent de nouveaux tabitems avec des vues qui gèrent les détails de MappingSet en fonction de cet élément sélectionné. J'ai un View/ViewModel qui, en fonction de la commande utilisée, doit retourner un tabitem pour créer un nouveau MappingSet sans données existantes, ou un tabitem contenant le détail de l'élément sélectionné pour l'édition, ou un tabitem contenant des détails sur l'élément sélectionné la base d'un nouveau MappingSet. Après avoir défini la scène, ce que je n'ai pas réussi à élaborer est une manière dépendante de la commande de passer des paramètres, tels que l'identifiant de l'objet MappingSet sélectionné, pour instancier mon viewmodel dans l'un des trois états mentionnés ci-dessus? Par exemple le messager mvvmlight serait-il approprié pour cette tâche?

Répondre

1

Ceci est un scénario parfait pour le messager/eventagrgregator. Cependant, votre chaîne de messages peut être un peu compliquée. D'après ce que je comprends, votre fenêtre principale contient une liste de commandes (comme un menu ou un ruban). Voici comment je vois la chaîne des événements.

  1. Vous sélectionnez un MappingSet du DataGrid, cela provoque un message MappingSetSelected à feu (avec une charge utile de la MappingSet sélectionnée)
  2. La fenêtre principale écoute pour ce message et stocke les MappingSet
  3. actuellement sélectionné Lorsque l'utilisateur clique sur le bouton, un message "EditMappingSet" ou "CreateNewMappingSet" est renvoyé (ou si la fenêtre est responsable de la création des nouvelles vues, elle les crée elle-même).
0

S'il n'y a que trois options, vous pouvez les lier à trois commandes différentes et, au sein des commandes, faire passer votre variable auto-définie.

private RelayCommand _openMappingSetCommand; 

//Command that one of your options is bound to 
public ICommand ViewMappingSetOption1 
    { 
     get 
     { 
      if (_openMappingSetCommand == null) 
      { 
       _openMappingSetCommand = new RelayCommand(param => this.DoTabRequest("your parameter"); 
      } 
      return _openMappingSetCommand ; 
     } 
    } 


// Method that creates your viewmodel 
private void DoTabRequest(parameterType parameter) 
    { 
     WorkspaceViewModel viewModel = null; 

     if (viewModel == null) 
     { 
      viewModel = (WorkspaceViewModel)Activator.CreateInstance(typeof (viewModelType), parameter); 
      this.Workspaces.Add(viewModel); 
     } 

     this.ActiveWorkspace = viewModel; 
    } 

Ensuite permettent de ce paramètre sur le constructeur de votre viewmodel et faire tout ce dont vous avez besoin sur cette base.

+0

Ma solution combinait Messenger pour fournir les données au modèle MainWindow View qui contenait les commandes, puis transmis en tant que paramètre au ViewModel lancé par la commande. Donc, combiné à la fois les réponses de Steve et Mike. –

Questions connexes