MVVM-查看模型 - 查看模型通信

时间:2010-03-19 03:17:06

标签: wpf silverlight mvvm design-patterns

如何使用MVVM Light让两个视图模型相互通信。我知道如何使用messenger类并注册等。这是我的场景

A Settings View ---> a Settings View Model 
                                  .
                                  .
                                  .

A MainPage View ---> A MainPage ViewModel

如果设置视图中的某些内容发生变化,它将回复到“设置视图模型”。那么我希望设置视图模型与MainPage视图模型进行通信,了解更改的内容。然后,MainPage ViewModel将告诉View。

4 个答案:

答案 0 :(得分:18)

这种问题风格的一个常见模式是Mediator(一个视图模型引用的类,可用于在两者之间传递消息)。

此后,Mediator类已移至Cinch WPF/SL MVVM Framework,似乎仍在积极开发/支持。

我更喜欢的模式是Event Aggregator,可以在Prism框架中找到一个例子。在此模式中,不同的视图模型订阅聚合器中的事件,而其他视图模型则发布事件。

希望这有帮助

答案 1 :(得分:3)

我是第二个奈杰尔关于使用Mediator的建议,看看Josh Smith的博客及其实现:

http://joshsmithonwpf.wordpress.com/?s=mediator

在底部你可以下载Mediator Prototype和Demo,只需记住将它从.doc重命名为.zip。

希望这会有所帮助......

答案 2 :(得分:1)

您可以尝试的一件事是尝试实现依赖倒置。 使用某些操作/合同定义接口。 在MainviewModel上实现该接口。 将该接口作为成员变量传递给SettingsViewModel。 因此,每当设置视图模型必须向main通知某些内容时,它将使用该接口。 此外,其他视图模型可以使用相同的策略。  

public interface IMessenger
    {
      void NotifyAction();
    }

public class MainViewModel:InotifyProprtyChanged,IMessenger
{
 public void NotifyAction()
{
}
}

public class SettingsViewModel:INotifyPropertyChanged
{
  public IMessenger Messenger{get;set;}

  public void SomeCommandExecutor()
  {
    if(Messenger!=null)
     {
       Messenger.NotifyAction();    
     }

  }
}

public class MainViewModel:InotifyProprtyChanged,IMessenger { public void NotifyAction() { } } public class SettingsViewModel:INotifyPropertyChanged { public IMessenger Messenger{get;set;} public void SomeCommandExecutor() { if(Messenger!=null) { Messenger.NotifyAction(); } } }

答案 3 :(得分:0)

可能你可以使用sur Mediator pattern V2 由Josh Smith&马龙格雷奇

MVVM Foundation library中查看Messenger类V2,或直接在Marlon Grech blog

上查看