Comment enregistrer le gestionnaire de messages avant l’appel bloquant ShowDialog ()?

J’utilise une classe Messenger afin d’envoyer des données entre les modèles de vue. Il existe une AppView qui héberge deux vues principales dans un contrôle de contenu et n’a jusqu’à présent rencontré aucun problème pour envoyer / recevoir des données de cette façon.

Problème:

Maintenant, j’ai ajouté un ProductView qui montre une boîte de dialog séparée à la AppView. Mais lorsque j’appelle Messenger.Default.Send(SelectedProduct); Après avoir appelé .ShowDetailDialog (), ceci bloque l’appel d’ Send code, jusqu’à ce que la boîte de dialog soit fermée.

J’ai essayé l’inverse, en appelant d’abord le code d’ Send , puis en ouvrant la boîte de dialog. Mais cela signifie que le gestionnaire de messages de la machine virtuelle récepsortingce ne s’enregistre pas à temps avant que le message ne soit envoyé.

Est-ce que quelqu’un connaît une solution pour empêcher le dialog de bloquer l’appel envoyé? Ou bien enregistrez-vous le gestionnaire de messages ProductVM avant d’envoyer le message et d’afficher la boîte de dialog?

Vous trouverez ci-dessous un résumé des classes associées:

CustomerOrdersVM (code d’envoi):

  private void EditOrder(object obj) { _dialogService.ShowDetailDialog(); Messenger.Default.Send(SelectedProduct); } 

ProductVM (code de réception):

  public ProductViewModel() { Messenger.Default.Register(this, OnSelectedProductReceived); } 

DialogService:

 class DialogService : IDialogService { Window productView = null; public DialogService() { } public void ShowDetailDialog() { productView = new ProductView(); productView.ShowDialog(); } } 

AppVM (les machines virtuelles principales sont enregistrées, ProductVM est indépendant de cette machine virtuelle):

  public ApplicationViewModel() { // Add available pages PageViewModels.Add(new CustomerDetailsViewModel(customerDataService, countryDataService, dialogService)); PageViewModels.Add(new CustomerOrdersViewModel(orderDataService, dialogService)); PageViewModels.Add(new OrderStatisticsViewModel()); // Set starting page CurrentPageViewModel = PageViewModels[0]; } 

AppView: (contient les vues AppVM):

                                   

Vous pouvez résoudre le problème de plusieurs manières:

  1. N’utilisez pas ShowDialog() . Utilisez Show() et ouvrez la fenêtre de dialog TopMost à la fenêtre principale.
  2. Enregistrez le ProductView dans le constructeur du DialogService (avez-vous vraiment besoin d’un nouveau ProductView chaque fois?)

  3. DialogService le DialogService (ou une classe d’utilitaire à l’intérieur de celui-ci) au moment de la construction du message, puis transmettez-le à tous les produits ProductView affichés.

Personnellement, j’aime bien # 2 puisque vous utilisez ShowDialog , cela signifie qu’un seul ProductView est nécessaire à la fois. Par exemple:

 class DialogService : IDialogService { Window productView = null; ProductView _productView; public DialogService() { _productView = new ProductView(); } public void ShowDetailDialog() { _productView.ShowDialog(); } }