我正在使用MVVM和PRISM处理WPF应用程序并陷入一个问题。
我有两个不同的视图(View1和View2)及其各自的视图模型。
View1是主视图,具有域对象列表,View2用于显示域对象的属性。现在,每次更改选择时,我都需要将对象传递给View2。
我知道我们可以IEventTrigger
,但视图模型只有在它驻留在内存中时才能监听事件。
所以我的问题出现了。由于第一个没有选择项目。 View2未呈现。我不知道如何通过Event首次将对象传递给View2。
可能的解决方案是什么?
答案 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中传递SelectedItempublic 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
的使用方式,因为我发现默认语法非常混乱,起初很难理解。我将它用于大多数小型应用程序。