MVVM - 在视图之间导航

Raj*_*Rao 1 silverlight prism mvvm

我有一个ListBox绑定到ViewModel,它暴露ObservableCollection类型的参数.我已经设置了一个ICommand,当选择ListBox中的一行时,它会被触发.(在这篇文章中使用方法3 - 顺便说一句,它很有用).

现在我的问题(与上述方法3或ListBox无关)是我的ICommand被触发时我要做的是导航到另一个页面(例如:详细信息页面),其中存储的是逻辑(或者我该怎么做?).

我问的原因是我不确定如何在ViewModel类中设置命令方法,使其保持可测试性.

ps:我正在使用Prism,并且还想知道它是否为Navigation提供任何类/模式.

Chr*_*ard 6

只是详细说明它的使用IEventAggregator- 它为您提供了一个简单的Pub/Sub模型,用于在解耦(即既不需要了解其他任何部分)应用程序之间发送任意消息.所以我们可以IEventAggregator在我们的ViewModel构造函数中获得引用(这是由框架自动解决的),即:

private IEventAggregator eventAggregator;

public PublisherViewModel(IEventAggregator eventAggregator)
{
    this.eventAggregator = eventAggregator;
Run Code Online (Sandbox Code Playgroud)

然后在我们的选择更改处理程序中,我们可以发布事件:

var changedEvt = eventAggregator.GetEvent<MyListboxChangedEvent>();
changedEvt.Publish(selectedItemId);
Run Code Online (Sandbox Code Playgroud)

这取决于我们的自定义事件类MyListboxChangedEvent:

public class MyListboxChangedEvent : CompositePresentationEvent<int> {}
Run Code Online (Sandbox Code Playgroud)

最后,在响应此操作的ViewModel中,我们设置了对事件的订阅,以及相应的处理程序方法:

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

public void OnListBoxChanged(int selectionId)
{
    // do whatever we need
}
Run Code Online (Sandbox Code Playgroud)

看起来像很多胶水,但它成为将UI的不同部分连接在一起的合理方法,并且它很快成为第二天性.