2011-04-02 61 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的不同部分布线在一起的逻辑方法,并且它很快变得第二性质。