2011-04-02 78 views
1

我有一個綁定到ViewModel的列表框,該列表框公開了ObservableCollection類型的參數。我設置了一個ICommand,當ListBox中的一行被選中時它會被觸發。 (在這個post中使用方法3 - 順便說一下它工作的很好)。MVVM - 在視圖之間導航

現在我的問題(這與上面描述的方法3或ListBox無關)是當我的ICommand被觸發,我想要做的是導航到不同的頁面(例如:細節頁面),其中是邏輯存儲(或者我該怎麼做?)。

我問的原因是我不確定如何在ViewModel類中設置命令方法,使其保持可測試狀態。

ps:我正在使用棱鏡,也想知道它是否提供導航的任何類/模式。

回答

3

您是否考慮過使用EventAggregator發送要顯示不同視圖的消息。包含在PRISM發行版中的StockTrader應用程序將提供一個很好的例子。

6

只是爲了詳細說明IEventAggregator的使用 - 它爲您提供了一個簡單的Pub/Sub模型,用於在應用程序的解耦(即不需要了解其他任何信息)之間發送任意消息。因此,我們可以得到我們的視圖模型構造的IEventAggregator的引用(這是由框架自動爲您解決),即:

private IEventAggregator eventAggregator; 

public PublisherViewModel(IEventAggregator eventAggregator) 
{ 
    this.eventAggregator = eventAggregator; 

然後我們選擇改變處理程序,我們可以發佈事件:

var changedEvt = eventAggregator.GetEvent<MyListboxChangedEvent>(); 
changedEvt.Publish(selectedItemId); 

這依賴於我們的自定義事件類MyListboxChangedEvent

public class MyListboxChangedEvent : CompositePresentationEvent<int> {} 

所以最後,這是爲了響應這個動作視圖模型,我們小號等一個訂閱的情況下,和對應的處理程序方法:

public SubscriberViewModel(IEventAggregator eventAggregator) 
{ 
    var changedEvt = eventAggregator.GetEvent<MyListboxChangedEvent>(); 
    changedEvt.Subscribe(OnListBoxChanged, ThreadOption.UIThread); 
} 

public void OnListBoxChanged(int selectionId) 
{ 
    // do whatever we need 
} 

好像大量的膠水,但它成爲用於UI的不同部分佈線在一起的邏輯方法,並且它很快變得第二性質。