0

我在我的 WPF 应用程序中使用 MVVM 模式。在我的一个视图中,我有一个按钮,单击该按钮时使用命令与其 ViewModel 对话。我遇到的问题是我需要 ViewModel 然后与其他 ViewModel 对话以调用他们的一些公共方法。我使用 IOC (Unity) 并将容器注入到第一个 ViewModel 中,因此可以使用它访问其他容器。我不确定这是否符合 MVVM 概念。

我的所有 ViewModel 是否有可能以某种方式订阅一键单击?这些是解决此问题的推荐方法还是有更好的方法?

为了进一步解释我的应用程序,每个视图都是一个带有多个文本框的选项卡控件。在第一个选项卡上还有一个按钮和组合框。用户可以自由输入自己的数据或从组合中选择一个选项。在这种情况下,如果然后单击按钮,我需要所有选项卡根据第一个选项卡的组合中的选定项目加载其文本框。我需要以某种方式连接此按钮单击,以便将组合中的值传递给所有相关的视图模型。

4

4 回答 4

2

您可以使用EventAggregator。让命令发布其他 ViewModel 可以订阅的事件。引发事件时,他们都会收到事件,而不需要一个 VM 知道其他 VM

另一种选择是使用复合命令而不是常规命令。使命令按钮使用复合命令,并让其他视图模型注册到该复合命令。

于 2013-01-28T14:38:32.593 回答
0

您可以通过以下几种方式进行此操作:

  • 如果发生某些事情,请使用某种事件框架来通知所有订阅者:例如Prism EventAggregator。为此,您显然需要设置 Prism。还有其他(MVVM)框架支持某种事件/消息系统,如Caliburn.MicroMVVMLight

  • 创建一个MasterViewModel包含所有选项卡的所有子视图模型。这样,“主”可以从其子级订阅 PropertyChanged 事件并执行适当的操作。或者 Master 甚至可以包含您绑定的命令。

于 2013-01-28T14:41:12.813 回答
0

我建议使用某种形式的“Messenger”服务。我的意思是一个实现“订阅模式”的类。

我不确定您可能使用的是哪个 MVVM 库,但如果您查看 CodePlex 上提供的“MVVM Light Toolkit”,您会在那里找到一个非常轻量级的 Messenger 实现。

基本上,每个 ViewModel 都会订阅接收特定的通知,并且带有组合框和按钮的 ViewModel 将在单击按钮时发布消息。发送消息的方式非常灵活,并且您的 ViewModel 不需要了解彼此的任何信息。

于 2013-01-28T14:44:25.263 回答
0

如果您使用 GalaSoft 的 MVVM lite 工具包,您可以访问 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
}
于 2013-01-28T14:44:54.340 回答