2017-03-31 68 views
1
之间的通信


在我ViewmodelA我想在ViewModelB打开一个新的窗口,所以我用了信使类,但probleme是,我需要引用ViewModelBViewModelA内部,使得ViewModelB能听消息。
这里是我的执行
在ViewModelA:
MVVM光使者的ViewModels

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

+0

你能解释为什么你需要引用'ViewModelB'吗?你期待一个结果或什么? – MrZander

+0

我只想试验messenger类,并在视图模型之间发送数据 –

+0

因为您在B的构造器中注册了消息处理器,并在那里处理它,所以您需要有一个'ViewModelB'实例在某处实际处理消息。通常情况下,该实例将作为应用程序的一部分在其他位置创建(例如,两个窗口试图相互通信)。 –

回答

1

如果您正确使用信使,我不会完全看到耦合发生的位置。有没有必要引用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")); 
    } 
} 
+0

那么,需要有一个'ViewModelB'的实例在某处为消息做任何事情。据推测,这就是他为什么要创建一个。我认为他有一个[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

@BradleyUffner你可能是对的。我假设他试图通过两个开放的视图或类似的东西进行交流。 我猜ViewModelB可以有一个静态构造函数注册消息?看起来像一个奇怪的场景。 – MrZander

+0

@BradleyUffner,我想我的问题很清楚,哈哈。 @MrZander是我的实现,但我需要在'ViewModelA'中创建一个'ViewModelB'的实例,否则'ViewModelB'将不会听任何东西 –