2011-02-09 1 views
3

J'ai complètement adopté le modèle MVVM pour notre application Silverlight. Cependant, certaines de nos interfaces utilisateur sont basées sur les données. Principalement deux éléments ...Comment puis-je construire l'interface utilisateur à la volée dans mon modèle de vue

  1. Le menu. Nous utilisons Infragistics XamMenu.

  2. Nous avons un "tableau de bord" qui permet aux utilisateurs d'ajouter des "snap-ins". C'est un peu comme un site portail tel que iGoogle.

Dans les deux cas ci-dessus, l'interface utilisateur doit être créée au moment de l'exécution. Actuellement, je cours le code dans le code derrière parce que je ne vois pas un moyen facile d'accéder à l'arbre de l'interface utilisateur dans le ViewModel.

Pour exécuter le code dans la vue, j'ai créé un événement dans le ViewModel qui se déclenche une fois les données chargées. Donc, je dois faire une référence au viewmodel dans le code de la vue derrière. Je ne l'aime pas un, il est très laid ... donc essentiellement deux questions:

  1. Comment puis-je avoir la vue obtenir un message du viewmodel que les données sont chargées sans obtenir une référence directe à la viewmodel dans le code de la vue derrière? Actuellement, je tire la référence du contexte de données.

  2. Est-il possible de créer l'interface utilisateur dans le modèle de vue et d'utiliser la liaison de données? Je me demandais si je pouvais lier le "contenu" d'un contentcontrol à un certain type (pas sûr de ce que le type serait) dans le viewmodel? Bien sûr, la mauvaise partie à ce sujet est la testabilité du modèle de vue semble disparaître. La reliure peut-elle être utilisée de cette façon?

Répondre

2

Pour répondre à la question 1, pourquoi ne pas utiliser la classe MVVM "Messenger".

À votre avis, vous vous inscrivez pour écouter un message de la manière suivante:

Messenger.Default.Register<bool>(this, "MessageId", DoSomething); 

Où DoSomething est une méthode qui prend un paramètre booléen (par exemple).

Ensuite, pour envoyer le message de votre modèle de vue, vous procédez comme suit:

Messenger.Default.Send(false, "MessageId"); 

Hope qui aide :) Vous devrez ajouter à votre usings:

using GalaSoft.MvvmLight.Messaging; 
+0

ok .. Je suppose que je ne suis pas sûr de ce qu'il faut faire ici. Je veux essentiellement envoyer un "message" que "X" est arrivé. Il n'y a pas de valeur transmise ... Je veux juste le triger, un peu comme un événement, mais sans avoir besoin d'une référence à l'expéditeur comme il faut pour un événement. Est-ce possible? – PilotBob

+0

Certainement possible en utilisant le code dans l'exemple. Vous devez enregistrer l'événement pour prendre un paramètre - mais au lieu de bool, il suffit de le faire accepter un objet et d'envoyer null à travers. Ensuite, vous pouvez faire ce que vous voulez du côté de la vue grâce à la méthode DoSomething. – Madeleine

+0

Le MVVM Light est vraiment léger sur doc. ;) Le prisme doc indique même que le code qui modifie l'arbre visuel ou les commandes de références doit être dans le code derrière. Donc, je vais accepter cela comme la réponse à la question 1 et accepter que "vous ne pouvez pas" est la réponse à la question 2. Merci. – PilotBob

Questions connexes