C# 从viewmodel导航到新页面
我的程序使用了WP7数据绑定应用程序模板,该模板使用了MVVM的形式。我想从我的主页导航到我的设置页面,但因为是VM加载数据,而VM又决定是否需要加载设置页面,所以我想从VM而不是视图调用导航代码。但是,NavigationService不在VM中显示Navigate方法,只在视图中显示。有人对我如何在VM中调用Navigate方法有什么建议吗 谢谢C# 从viewmodel导航到新页面,c#,windows-phone-7,mvvm,C#,Windows Phone 7,Mvvm,我的程序使用了WP7数据绑定应用程序模板,该模板使用了MVVM的形式。我想从我的主页导航到我的设置页面,但因为是VM加载数据,而VM又决定是否需要加载设置页面,所以我想从VM而不是视图调用导航代码。但是,NavigationService不在VM中显示Navigate方法,只在视图中显示。有人对我如何在VM中调用Navigate方法有什么建议吗 谢谢 杰森。我倾向于使用以下方法之一 在VM中发布事件,在视图中订阅 实现全局导航服务(使用ServiceLocator模式或DI),例如,您可以在应
杰森。我倾向于使用以下方法之一
- 在VM中发布事件,在视图中订阅
- 实现全局导航服务(使用ServiceLocator模式或DI),例如,您可以在应用程序类中实现这样的接口
App.xaml.cs
中将其作为静态方法实现,如下所示
public static void Navigate(Uri source)
{
Dispatcher.BeginInvoke(() => (App.Current.RootVisual as PhoneApplicationFrame).Navigate(source));
}
这样你就可以在任何地方调用App.Navigate(uri)
您可能还希望实现GoBack()
:
您是否有任何有用的示例或资源来解释ServiceLocator模式?为什么要将其过度复杂化。如果您真的想要纯粹的分离,那么导航应该仍然是视图的任务。Claus,决定页面是否应该导航到的数据在VM中,加载数据的事件处理程序也在VM中,因此这似乎是执行导航的正确位置。我已经实现了您建议的事件,它工作得很好,但是,app.xaml.cs中的state方法似乎更有用,可以从VM跳转到V,而无需到处都是事件和处理程序。非常感谢您的解决方案。如果您将静态应用程序类视为定位器以及实现本身,那么这或多或少是一种ServiceLocator;)
public static void GoBack()
{
Dispatcher.BeginInvoke(() => (App.Current.RootVisual as PhoneApplicationFrame).GoBack());
}