2017-03-31 1 views
1


Dans mon ViewmodelA je veux ouvrir une nouvelle fenêtre dans ViewModelB, donc je l'ai utilisé la classe messager, mais le Probleme est que je dois faire référence ViewModelB à l'intérieur du ViewModelA, de sorte que ViewModelB peut écoutez les messages.
ici est ma mise en œuvre
dans ViewModelA:
MVVM messager de la lumière, la communication entre viewmodels

private void btnAddExecute() 
{ 
    // I need to instanciate ViewModelB otherwise it wont work/listen 
    ViewModelB vb= new ViewModelB(); 

    Messenger.Default.Send(new NotificationMessage("ShowWindow"));  
} 

dans ViewModelB i écouter les messages diffusés dans son constructeur.

est-il de toute façon découpler ViewmodelA de ViewmodelB?

+0

Pouvez-vous expliquer pourquoi vous avez besoin de référencer 'ViewModelB'? Attendez-vous un résultat ou quelque chose? – MrZander

+0

Je veux juste expérimenter avec la classe messenger, et envoyer des données entre viewmodels –

+0

Parce que vous avez enregistré le gestionnaire de message dans le constrcutor de B, et le gérer là, vous avez besoin d'une instance de 'ViewModelB' quelque part pour gérer réellement le message. Généralement cette instance serait créée ailleurs dans le cadre de votre application (deux fenêtres par exemple, essayant de communiquer entre elles). –

Répondre

1

Je ne vois pas exactement où le couplage se produit si vous utilisez le messager correctement. Il n'y a pas besoin de faire référence à ViewModelB

Modifier

Voici une façon de le faire sans se référer à une instance ViewModelB. Il utilise un singleton pour s'inscrire aux messages et créer ViewModelB lorsqu'il reçoit le message de notification. Je n'ai pas testé cela, c'est juste une idée. Assurez-vous que ViewModelBCreator est utilisé à un moment donné pour que le constructeur statique soit appelé.

public class ViewModelBCreator() 
{ 
    private static ViewModelBCreator instance; 
    static ViewModelBCreator() { instance = new ViewModelBCreator(); } 
    private ViewModelBCreator() 
    { 
     Messaging.Messenger.Default.Register<NotificationMessage>(this, true, NotificationMessageReceived); 
    } 
    private static void NotificationMessageReceived(NotificationMessage notification) 
    { 
     var vm = ViewModelB(); 
     //Do stuff with the new ViewModelB 
    } 
} 

public class ViewModelB 
{ 
    public ViewModelB() 
    { 
     //etc . . . 
    } 
} 

public class ViewModelA 
{ 
    public void OpenTheWindow() 
    { 
     Messenger.Default.Send(new NotificationMessage("ShowWindow")); 
    } 
} 
+0

Eh bien, il devrait y avoir une instance de 'ViewModelB' vivant quelque part pour que le message fasse quelque chose. C'est probablement pourquoi il en crée un. Je pense qu'il a un [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

+0

@BradleyUffner Vous avez peut-être raison. Je supposais qu'il essayait de communiquer à travers deux vues ouvertes ou quelque chose de similaire. Je suppose que ViewModelB pourrait avoir un constructeur statique qui s'enregistre pour le message? On dirait un scénario étrange. – MrZander

+0

@BradleyUffner exactement, je pensais que ma question était claire, lol. @MrZander c'était mon implémentation mais j'ai besoin de créer une instance de 'ViewModelB' dans' ViewModelA', sinon 'ViewModelB' n'écoutera rien –