2010-06-10 2 views
3

J'ai une application qui a un onglet Tâches et un onglet Projets. J'ai décidé de créer un ViewModel séparé pour chacun des onglets, TasksViewModel et ProjectsViewModel.État de partage/modifications dans ViewModels

L'onglet Tâches comporte une nouvelle zone de tâches avec un projet associé et l'onglet Projets (évidemment) contient une liste de projets. Je souhaite que le menu déroulant de l'onglet Tâches permette de partager la même collection que la liste d'onglets Projets. Ainsi, à chaque fois que j'ajoute ou supprime un projet dans l'onglet Projets, la liste de l'onglet Tâches date automatiquement. Cela a bien fonctionné avec un seul ViewModel mais il commençait à devenir assez indiscipliné.

Ne devrais-je pas me séparer en deux ViewModels? Existe-t-il une méthode commune de partage de données comme celle-ci? Peut-être passer le même ObservableCollection<Project> dans chacun des ViewModels? Peut-être un certain type de notification retour à la TasksViewModel le long des lignes de ICollectionChanged.

Appréciez toute idée/contribution!

Répondre

4

La solution la plus simple consiste souvent à utiliser une forme de service de messagerie pour transmettre des informations entre les deux ViewModels.

Par exemple, le MVVM Light Toolkit fournit un IMessenger interface pour les situations de ce type. L'utilisation d'une bonne boîte à outils IoC ou DI peut aussi aider dans cette situation. Cela vous permet d'injecter dynamiquement la collection de projets dans vos ViewModels, ce qui permet d'utiliser une collection partagée dans les deux vues.

+0

Je suis d'accord, mais seulement si les données font vraiment partie du modèle de vue, ne font pas partie du modèle. Si cela fait partie du modèle, je dirais que le faire passer d'un modèle de vue à l'autre serait une très mauvaise idée: mieux vaut partager un seul modèle tout au long de l'application. Je l'explique plus loin dans ma réponse. (Oui, je réalise que DI est un bon moyen d'accomplir le partage du modèle commun, mais je pense qu'il est très important de l'identifier comme tel.) –

+0

Thaks Reed, j'aime l'idée de la messagerie. J'ai utilisé une fonctionnalité similaire dans le framework WebformsMVP. – joshperry

3

Il me semble que vos concepts de "Tâches" et "Projets" font partie de votre modèle, et non de votre modèle de vue.

Considérez cet exercice conceptuel: Supposons que votre application a été écrit de telle sorte que deux utilisateurs pourraient utiliser votre application sur deux machines distinctes contre une base de données partagée et un utilisateur ajoute un projet:

  1. Serait-il un bon ou une mauvaise chose si le projet apparaissait immédiatement dans la liste déroulante de l'onglet Tâches de l'écran de l'utilisateur autre?
  2. Serait-ce une bonne ou une mauvaise chose si le projet apparaissait dans cette liste déroulante après que le premier utilisateur a frappé "Enregistrer" ou "Valider" ou "OK"?

Si la réponse à l'une de ces questions est « une bonne chose », vos données est vraiment partie de votre modèle pas votre modèle vue. Et cela devrait être géré comme tel.

Votre modèle de vue doit incorporer votre modèle réel par référence, et c'est une bonne chose de partager autant que possible les objets du modèle entre les vues. En fait, idéalement, la plupart de votre application a un seul ensemble d'objets de modèle. L'exception peut être une boîte de dialogue dans laquelle vous voulez être en mesure de faire des changements, puis cliquez sur "Annuler" et ne pas les enregistrer. Dans ce cas, le bouton "Ok" copie les données du modèle géré par votre boîte de dialogue dans le modèle d'application principal. Dans ce cas, les objets de modèle utilisés par le dialogue et par l'application principale sont des instances différentes de la même classe.

Maintenant, considérons le cas où vous avez répondu «une mauvaise chose» à ces deux questions.Il s'agirait d'une application dans laquelle vous ne sauvegarderez jamais votre liste "Projets" dans la base de données/le document/le fichier principal, mais il s'agit d'une liste transitoire utilisée uniquement pour un travail temporaire. Dans ce cas, ce serait vraiment un modèle de vue, et je l'attacherais à l'application (ou à n'importe quelle portée) et j'aurais accès aux deux onglets.

+0

"Si la réponse à l'une ou l'autre de ces questions est 'oui'" est déroutant quand la question est "Serait-ce bon ou mauvais si ...?" Lequel est «oui», «bien» ou «mauvais»? – JohnMetta

+0

Merci d'avoir attrapé ça. J'ai corrigé le texte. –