如何在不成为Page的情况下获取NavigationService?

时间:2011-02-28 18:24:08

标签: silverlight mvvm navigation viewmodel

这似乎是一个非常天真的问题,但是人们究竟如何从页面外部获取NavigationService,比如说可能是一个视图模型?每个人都说应该在视图中进行导航,但我一直在想,这不是一个网页,它是一个应用程序。视图模型和业务逻辑应该控制应用程序流,而不是视图。这实际上是天真的吗?

3 个答案:

答案 0 :(得分:2)

据我了解,涉及View的操作(即UI)应由View专门完成。使用MVVM时,UI不应由ViewModel或BusinessLogic直接控制(因为它们不应该知道有关View的具体实现的任何信息),而是使用Messages。

这意味着,如果我们想从ViewModel打开一个Editor窗口,我们会从ViewModel发送一条消息,我们要打开它并在View中接收它并在那里打开窗口。这同样适用于浏览不同的页面,您可以在主页中接收消息(或任何您想要浏览的页面)并处理那里的所有内容。

另一种方法是使用DialogService或类似的东西,它处理在中心位置打开窗口。但是,由于NavigationService是Page类的属性,我们需要处理Page。

中的消息

示例代码,使用MVVM Light Toolkit :(未经测试,部分取自Shawn Wildermuth的RiaXBoxGames example):

ViewModel(例如,将其放在按钮的Command中):

Messenger.Default.Send<bool>(true, "GoToNextPage");

查看(例如将其置于构造函数中):

Messenger.Default.Register<bool>(this, "GoToNextPage", ignore =>
{
  // your code to go to next page
});

答案 1 :(得分:1)

另一种选择是在ViewModel上创建一个事件,在Command发生时触发此事件并订阅View到此事件。在EventArgs内部,您可以携带哪个页面导航到等等。我认为简单且可测试的解决方案。

罗伯特

答案 2 :(得分:0)

我在创建View-Model时只传递对Frame的引用。