Mvvm light messenger,视图模型之间的通信

时间:2017-03-31 22:18:33

标签: c# wpf mvvm-light


在我的ViewmodelA中,我想在ViewModelB中打开一个新窗口,所以我使用了messenger类,但问题是我需要在ViewModelB中引用ViewModelA,以便ViewModelB可以收听消息 这是我的实施 在ViewModelA中:

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

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

我在其构建器中收听广播的消息。

无论如何要将ViewmodelAViewmodelB分开?

1 个答案:

答案 0 :(得分:1)

如果您正确使用信使,我不确切地知道耦合发生在哪里。无需参考ViewModelB

修改

这是一种在不引用实例ViewModelB的情况下执行此操作的方法。它使用单例来注册消息,并在收到通知消息时创建ViewModelB。我没有测试过这个,这只是一个想法。确保在某个时候使用ViewModelBCreator,以便调用静态构造函数。

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"));  
    }
}