如何通过事件将对象传递给MVVM中的不同viewmodel,即使还没有渲染视图

时间:2013-02-01 08:31:32

标签: wpf mvvm prism viewmodel

我正在使用MVVM和PRISM处理WPF应用程序并陷入一个问题。

我有两个不同的视图(View1和View2)及其各自的视图模型。

View1是主视图,具有域对象列表,View2用于显示域对象的属性。现在,每次更改选择时,我都需要将对象传递给View2。

我知道我们可以IEventTrigger,但视图模型只有在它驻留在内存中时才能监听事件。

所以我的问题出现了。由于第一个没有选择项目。 View2未呈现。我不知道如何通过Event首次将对象传递给View2。

可能的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

如果View1包含具有SelectedItem属性的List,则可以在ViewModel1中创建SelectedItem-Property。您在ViewModel1中创建ViewModel2-Property。

你绑定它就像:

<ListView SelectedItem="{Binding Path=SelectedItem}">
 .
 .
</ListView>
<my:view2 DataContext="{Binding Path=ViewModel2}"/>

最后,在SelectedItem-Property:

的setter中传递SelectedItem
public object SelectedItem
{
    get { return _seledtedItem; }
    set { _selectedItem = value; ViewModel2.SomeProperty = _selectedItem; OnPropertyChanged("SelectedItem"); }
}

答案 1 :(得分:1)

由于您说in a comment您不希望一个ViewModel引用另一个ViewModel,因此您可以使用PRISM的EventAggregator代替

每当选择更改时,从SelectionChangedMessage广播ViewModel1,并ViewModel2订阅即可接收这些消息。

如果您还需要在首次创建ViewModel2时知道所选项目,请让它广播GetCurrentItemMessage之类的内容,ViewModel1可以订阅并接收广播SelectionChangedMessage

此外,如果您是PRISM EventAggregator的新用户,我可以使用static class on my blog来简化EventAggregator的使用方式,因为我发现默认语法非常混乱,起初很难理解。我将它用于大多数小型应用程序。