WPF:Button单击一个ViewModel应该在另一个viewmodel上执行命令

时间:2012-04-28 10:46:47

标签: wpf events mvvm parameters

我是mvvm的新手,我理解基本的观点。 现在我有一个问题: 我有两个不同的视图模型,它们将在另一个wpf gui上连接在一起。

在一个视图模型中,有一个按钮和一个复选框; (“左侧控制”) 现在的“伎俩”: 在另一个viewmodel上也有一个复选框。 (“右侧控制”)

现在:如果按钮被点击,那么应该检查另一个viewmodel是否也设置了复选框。

基本上我会用事件或“信号”来做,但问题是,如果选中“右侧控制”上的复选框,则需要“左侧”的值。

实现将由一个事件完成,如果是这样的话:我怎样才能传递参数??

因为我是那个mvvm的新手,我不知道我到底在想什么,以及哪种解决方案将是“最先进的”和“mvvm”式。

3 个答案:

答案 0 :(得分:1)

查看http://www.galasoft.ch/mvvm/,它有一个Messenger类,我认为它正是你需要的

答案 1 :(得分:0)

首先,UI交互听起来有点复杂 - 可能值得回顾一下您的UI交互 - 可以简化吗?假设没有(即复杂的UI需求是真实的):
听起来左侧视图模型(LVM)依赖于右侧视图模型(RVM)的属性。那么是否可以在视图模型属性中设置该关系,即可以将LVM设置为保存ref到RVM,并且绑定到复选框itselft的属性是否检查RVM上的依赖属性?然后你的命令(绑定在LVM上)只需检查LVM的属性。

答案 2 :(得分:0)

您需要使用一些Event Aggregator(例如from Prism library)来表示这些内容。这是一个c#伪代码示例,说明如何使用Prism的Event Aggregator:

在您的RVM中:

_eventAggregator.GetEvent<LeftCBCheckedEvent>()
    .Subscribe(SaveStateOfLeftCBLocally);

...

private void SaveStateOfLeftCBLocally(bool isLeftCBChecked)
{
    _isLeftCBChecked = isLeftCBChecked;
}

在你的LVM中:

public bool IsLeftCBChecked {get; set;}
...
_eventAggregator.GetEvent<LeftCBCheckedEvent>().Publish(IsLeftCBChecked);

事件定义:

public class LeftCBCheckedEvent : CompositePresentationEvent<bool>{}

因此,当按下该按钮时,您已经知道左侧复选框的状态。我强烈建议检查Prism,它是一个很棒的复合应用程序库,我认为它可以为你的项目增加一个很大的价值。