我在WPF应用程序中使用MVVM模式。在我的一个视图中,我有一个按钮,单击时使用命令与其ViewModel通信。我遇到的问题是我需要ViewModel然后与其他ViewModel交谈以调用它们的一些公共方法。我使用IOC(Unity)并将容器注入第一个ViewModel,因此可以使用它来访问其他ViewModel。我不确定这是否符合MVVM概念。
我的所有ViewModel都可以以某种方式订阅单击按钮吗? 这些中的任何一种是解决这个问题的推荐方法还是有更好的方法?
为了更多地了解我的应用程序,每个视图都是一个包含多个文本框的选项卡控件。在第一个选项卡上还有一个按钮和组合框。用户可以自由输入自己的数据或从组合中选择一个选项。在这种情况下,如果单击该按钮,我需要所有选项卡根据第一个选项卡中组合中的选定项加载其文本框。我以某种方式需要连接此按钮单击,以便将组合中的值传递给所有相关的视图模型。
答案 0 :(得分:2)
您可以使用 EventAggregator 。让命令发布其他ViewModel可以订阅的事件。 当事件被提出时,他们都将获得该事件,而不需要一个VM知道其他VM
另一种选择是使用 Composite Commands 而不是常规命令。 使命令按钮使用复合命令,并使其他视图模型register到该复合命令。
答案 1 :(得分:0)
你可以用这个方法:
使用某种事件框架来通知所有订阅者是否发生了某些事情:例如Prism EventAggregator。为此,你需要明确地设置Prism。还有其他(MVVM)框架支持某种事件/消息系统,如Caliburn.Micro或MVVMLight
创建一个MasterViewModel
,其中包含所有选项卡的所有子视图模型。这样,'master'可以从其子节点订阅PropertyChanged事件并执行适当的操作。或者Master甚至可以包含您绑定的命令。
答案 2 :(得分:0)
我建议使用某种形式的“Messenger”服务。通过这个,我的意思是实现“订阅模式”的类。
我不确定您可能正在使用哪个MVVM库,但如果您查看CodeMlex上提供的“MVVM Light Toolkit”,您会发现一个非常轻松的Messenger实现。
基本上每个ViewModel都会订阅以接收特定通知,并且带有组合框和按钮的ViewModel将在单击按钮时发布消息。您发送消息的方式非常灵活,您的ViewModel不需要了解彼此的任何信息。
答案 3 :(得分:0)
如果您使用的是GalaSoft的MVVM light工具包,则可以访问Messenger,这样您就可以在每个视图模型中发送可以订阅的消息。
// Send message from command handler
Messenger.Default.Send<MyMessage>(new MyMessage());
// Register for message in view models.
Messenger.Default.Register<MyMessage>(this, MyMessageReceived);
// Method to do work
private void MyMessageReceived(MyMessage myMessage)
{
// Do Work
}