如何使用MVVM Light让两个视图模型相互通信。我知道如何使用messenger类并注册等。这是我的场景
A Settings View ---> a Settings View Model
.
.
.
A MainPage View ---> A MainPage ViewModel
如果设置视图中的某些内容发生变化,它将回复到“设置视图模型”。那么我希望设置视图模型与MainPage视图模型进行通信,了解更改的内容。然后,MainPage ViewModel将告诉View。
答案 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
上查看