2010-04-15 7 views
1

J'ai un fichier wpf qui affiche une liste d'informations dans une fenêtre séparée et dans un fil distinct de l'application principale. Lorsque l'utilisateur effectue des actions dans la fenêtre principale, la fenêtre latérale est mise à jour. (Par exemple, si vous avez cliqué sur la page suivante dans la fenêtre principale, une liste déroulante dans la fenêtre latérale descendrait vers le bas). À l'heure actuelle, l'architecture de cette application est très salissante et je suis sûr qu'il existe une façon plus simple de le faire. Il ressemble à ceci:Modèle de commande wpf

fenêtre principale contient un singleton SideWindowControl qui communique avec une instance de la SideWindowDisplay en utilisant des événements - ainsi, par exemple, le bouton pagedown fonctionnerait comme:

1) le gestionnaire d'événements du bouton sur la fenêtre principale appels SideWindowControl.PageDown()

2) dans la fonction PageDown() un événement est créé et lancé. 3) enfin le gui, ShowSideWindowDisplay s'abonne à l'événement SideWindowControl.Actions gère l'événement et fait défiler la liste vers le bas - note car il est dans un thread différent, il doit le faire en exécutant la commande via Dispatcher.Invoke (

Cela semble juste comme une manière très désordonnée à ceci et il doit y avoir une manière plus claire (la seule partie qui ne peut pas changer est que la fenêtre principale et la fenêtre de côté doivent être sur différents fils). Peut-être en utilisant des commandes WPF?

J'apprécierais vraiment toutes les suggestions !! Merci

Répondre

1

Vous pouvez essayer d'utiliser un médiateur/Messenger pour envoyer des messages entre les vues ou ViewModels. Vous pouvez jeter un oeil à la mise en œuvre qui vient avec MVVM Light, pour voir comment c'est fait.

L'idée serait quelque chose comme ceci:

  1. fenêtre principale exécute l'action
  2. action déclenche une commande dans une méthode ViewModel
  3. de commande envoie un message aux Messenger
  4. fenêtre latérale est abonnée ViewModel
  5. Un événement est déclenché sur la fenêtre latérale VM lorsque le message arrive; la fenêtre latérale agit en conséquence.

Une autre option consiste à lier les deux contrôles au même ViewModel, qui contiendrait alors toutes les commandes et coordonnerait les actions.