【问题标题】:MVVM - navigating between viewsMVVM - 在视图之间导航
【发布时间】:2011-04-02 14:39:06
【问题描述】:

我有一个绑定到 ViewModel 的 ListBox,该 ViewModel 公开了 ObservableCollection 类型的参数。我已经设置了一个 ICommand,当 ListBox 中的某一行被选中时它会被触发。 (在post 中使用方法 3 - 顺便说一句,效果很好)。

现在我的问题(与上述方法 3 或 ListBox 无关)是我的 ICommand 何时被触发并且我想要做的是导航到不同的页面(例如:详细信息页面),逻辑在哪里存储(或者我该怎么做?)。

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

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

【问题讨论】:

    标签: silverlight mvvm prism


    【解决方案1】:

    只是为了详细说明IEventAggregator 的使用 - 它为您提供了一个简单的 Pub/Sub 模型,用于在应用程序的解耦部分之间发送任意消息(即不需要知道任何其他部分)。因此,我们可以在 ViewModel 构造函数中获得对 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> {}
    

    所以最后,在响应这个动作的 ViewModel 中,我们设置了对事件的订阅,以及对应的处理方法:

    public SubscriberViewModel(IEventAggregator eventAggregator)
    {
        var changedEvt = eventAggregator.GetEvent<MyListboxChangedEvent>();
        changedEvt.Subscribe(OnListBoxChanged, ThreadOption.UIThread);
    }
    
    public void OnListBoxChanged(int selectionId)
    {
        // do whatever we need
    }
    

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

    【讨论】:

      【解决方案2】:

      您是否考虑过使用 EventAggregator 来发送您想要显示不同视图的消息。 PRISM 发行版中包含的 StockTrader 应用程序将提供一个很好的使用示例。

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多