当我使用MVVM模式和MVVM灯光单击后退按钮时,如何返回预览页面?

当我使用MVVM模式和MVVM灯光单击后退按钮时,如何返回预览页面?,mvvm,windows-phone-8.1,mvvm-light,Mvvm,Windows Phone 8.1,Mvvm Light,我有一个测试应用程序来测试WindowsPhone8.1上的导航,我可以从主页转到第二页 问题是,当我单击后退按钮时,我返回到桌面屏幕,应用程序进入后台,因此我必须按住后退按钮才能返回到应用程序 我见过重写backButtonKeyPressed事件的示例,但这在页面的代码隐藏中,因此这不适合我的情况,因为我想使用MVVM 在我的应用程序中,控制goBack事件的代码位于NavigationSerive中 实际上,我无法在MVVM中找到解决这个问题的好例子。使用MVVM Light并不是强制性的

我有一个测试应用程序来测试WindowsPhone8.1上的导航,我可以从主页转到第二页

问题是,当我单击后退按钮时,我返回到桌面屏幕,应用程序进入后台,因此我必须按住后退按钮才能返回到应用程序

我见过重写backButtonKeyPressed事件的示例,但这在页面的代码隐藏中,因此这不适合我的情况,因为我想使用MVVM

在我的应用程序中,控制goBack事件的代码位于NavigationSerive中

实际上,我无法在MVVM中找到解决这个问题的好例子。使用MVVM Light并不是强制性的,若有任何其他使用MVVM模式的方法,对我来说都是好的


谢谢。

这是我对导航服务的实现。我不会说它是完美的,但它对我很有用。这也比MVVM Light 5中的内置导航服务更早,但您可能仍然能够使用它,或者部分使用它

使用在ViewModelLocator中注册它

simpleoc.Default.Register()

然后通过构造函数将其注入到视图模型中。使用
NavigateTo()
导航到其他页面;按下“后退”按钮的处理程序仅在没有更多历史记录时退出应用程序,否则将导航到上一页

public interface INavigationService
{
    void NavigateTo(Type pageType, object parameter = null);

    void NavigateTo(string pageName, object parameter = null);

    void GoBack();
}

公共类导航服务:INavigationService
{
#地区公众
/// 
///导航到指定的页面。
/// 
public void NavigateTo(字符串pageName,对象参数=null)
{
Type pageType=Type.GetType(string.Format(“SendToSync.{0}”,pageName));
如果(pageType==null)
抛出新异常(string.Format(“未知页面类型“{0}”,pageName));
导航到(页面类型、参数);
}
/// 
///导航到指定的页面。
/// 
public void NavigateTo(类型pageType,对象参数=null)
{
var content=Window.Current.content;
var frame=内容作为框架;
如果(帧!=null)
{
var-previousPageType=frame.Content.GetType();
如果(previousPageType!=pageType)
NavigationHistory.Add(previousPageType);
//wait frame.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>frame.Navigate(pageType));
frame.Navigate(页面类型、参数);
}
Window.Current.Activate();
}
/// 
///回到过去。
/// 
公开作废GoBack()
{
var content=Window.Current.content;
var frame=内容作为框架;
如果(帧!=null)
{
var currentPageType=frame.Content.GetType();
//从历史记录中删除上一页
var previousPageType=NavigationHistory.Last();
导航历史记录。删除(previousPageType);
//向后导航
frame.Navigate(previousPageType,null);
}
}
#端区
#地区私人
/// 
///导航历史记录。
/// 
私有列表导航历史{get;set;}
#端区
#区域初始化
公共导航服务()
{
NavigationHistory=新列表();
HardwareButtons.BackPressed+=HardwareButtons\u BackPressed;
}
/// 
///按下后退按钮时调用;导航到上一页或退出应用程序。
/// 
私有无效硬件按钮\u反压(对象发送器,反压EventArgs e)
{
如果(NavigationHistory.Count==0)
{
e、 已处理=错误;
}
其他的
{
e、 已处理=正确;
GoBack();
}
}
#端区
}
编辑:以下是我的ViewModelLocator的部分内容

在构造函数中:

simpleoc.Default.Register()

以及随附财产:

public MainViewModel MainViewModel
{
    get { return ServiceLocator.Current.GetInstance<MainViewModel>();  }
}
public MainViewModel MainViewModel
{
get{return ServiceLocator.Current.GetInstance();}
}

这将始终返回相同的单一实例
MainViewModel
(并且视图模型数据将保持不变)。

这就是我需要的。只是一个疑问,我注意到,如果我有一个文本框,例如,其中有一个文本,我设置并转到另一个页面,当我返回到上一个页面时,文本框是空的,所以我猜在这种情况下是实例化一个新页面和一个新视图模型。有可能保留这些数据吗?谢谢。如果您使用
SimpleIoc.Default.Register()
设置视图模型,默认情况下它应该注册为单例,因此返回时应该只使用现有视图模型实例(数据完整),而不是创建新实例。当我有一个包含搜索结果的页面,并且可以来回导航时,搜索结果仍然是完整的。谢谢。问题是我必须用两种方式设置绑定的模式,否则视图模型中的porpery不会从视图中更新。因此,在WPF中,默认值是twoway,而不是WP8.1中的one-way。
public MainViewModel MainViewModel
{
    get { return ServiceLocator.Current.GetInstance<MainViewModel>();  }
}