2013-02-01 36 views
0

我正在使用MVVM和PRISM的WPF應用程序,並陷入一個問題。如何通過事件將對象傳遞給MVVM中的不同視圖模型,即使未呈現視圖

我有兩個不同的視圖(View1和View2)與他們各自的視圖模型。

View1是主視圖具有域對象列表和View2用於顯示域對象的屬性。現在我需要在每次選擇更改時將對象傳遞給View2。

我知道我們可以做到IEventTrigger,但是視圖模型只有當它駐留在內存中時才能監聽事件。

所以這裏出現我的問題。由於第一個沒有選擇的項目。 View2未呈現。我不知道如何通過事件第一次將對象傳遞給View2。

什麼是可能的解決方案?

回答

1

既然你說in a comment,你不想要一個視圖模型爲了引用另一個,您可以使用PRISM的EventAggregator代替

每當選擇更改時,廣播一個SelectionChangedMessageViewModel1,並有ViewModel2訂閱接收這些消息。

如果您還需要了解所選擇的項目時,第一次創建ViewModel2,有它播出像一個GetCurrentItemMessage,這ViewModel1可以訂閱和將使它重新播放SelectionChangedMessage

此外,如果你」對於PRISM的新手EventAggregator,我有一個static class on my blog,可以用來簡化EventAggregator的使用方式,因爲我發現默認的語法起初很混亂,很難理解。我用它來處理大多數小應用程序。

1

如果您的View1包含具有SelectedItem屬性的列表,則可以在ViewModel1中創建SelectedItem-Property。你在ViewModel1中創建一個ViewModel2-Property。

你綁定到它想:

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

最後你傳遞的SelectedItem在你的SelectedItem-setter方法:

public object SelectedItem 
{ 
    get { return _seledtedItem; } 
    set { _selectedItem = value; ViewModel2.SomeProperty = _selectedItem; OnPropertyChanged("SelectedItem"); } 
} 
+0

我不想把一個viewmodel引用到另一個。 –

+1

然後你可以使用mediator-pattern:http://www.codeproject.com/Articles/35277/MVVM-Mediator-Pattern PS .:我認爲可以在其父項ViewModel中引用ViewModels of Views。 –

+0

你的意思是不再使用IEventAggregator。 –

相關問題