0

我正在使用 MVVM 和 PRISM 开发 WPF 应用程序,但遇到了一个问题。

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

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

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

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

可能的解决方案是什么?

4

2 回答 2

1

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

你像这样绑定到它:

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

最后,您在 SelectedItem-Property 的设置器中传递 SelectedItem:

public object SelectedItem
{
    get { return _seledtedItem; }
    set { _selectedItem = value; ViewModel2.SomeProperty = _selectedItem; OnPropertyChanged("SelectedItem"); }
}
于 2013-02-01T08:40:32.343 回答
1

由于您在评论中说您不希望一个 ViewModel 引用另一个,因此您可以使用 PRISM 的EventAggregator来代替

Whenever the selection changes, broadcast a SelectionChangedMessagefrom ViewModel1, and have ViewModel2subscribe to receive those messages.

如果您还需要知道ViewModel2第一次创建所选项目时,让它广播类似 a 的内容GetCurrentItemMessage,它ViewModel1可以订阅接收并使其重新广播SelectionChangedMessage

此外,如果您是 PRISM 的新手,我的博客上EventAggregator有一个静态类,可用于简化PRISM 的使用方式,因为我发现默认语法起初非常令人困惑且难以理解。我将它用于大多数小型应用程序。EventAggregator

于 2013-02-01T15:46:54.687 回答