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

How back to previews page when I click back button using MVVM pattern and MVVM Light?

我有一个测试应用程序来测试 windows phone 8.1 上的导航,我可以从我的主页转到第二页。

问题是,当我点击后退按钮时,我 return 回到桌面屏幕,应用程序进入后台,所以我必须按住后退按钮 return 到申请。

我看过覆盖 backButtonKeyPressed 事件的示例,但这是在页面的代码后面,所以这不适合我的情况,因为我想使用 MVVM。

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

我真的找不到在 MVVM 中解决这个问题的好例子。 MVVM Light 不是强制性的,如果有任何其他方式使用 MVVM 模式,对我来说很好。

谢谢。

这是我实现的导航服务。不会声称它是完美的,但它对我有用。这也是 MVVM Light 5 中的 pre-dates built-in 导航服务,但您仍然可以使用它或其中的一部分。

使用

在 ViewModelLocator 中注册它

SimpleIoc.Default.Register<INavigationService, NavigationService>();

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

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

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

    void GoBack();
}

.

public class NavigationService : INavigationService
{
    #region Public

    /// <summary>
    /// Navigates to a specified page.
    /// </summary>
    public void NavigateTo(string pageName, object parameter = null)
    {
        Type pageType = Type.GetType(string.Format("SendToSync.{0}", pageName));

        if (pageType == null)
            throw new Exception(string.Format("Unknown page type '{0}'", pageName));

        NavigateTo(pageType, parameter);
    }

    /// <summary>
    /// Navigates to a specified page.
    /// </summary>
    public void NavigateTo(Type pageType, object parameter = null)
    {
        var content = Window.Current.Content;
        var frame = content as Frame;

        if (frame != null)
        {
            var previousPageType = frame.Content.GetType();

            if (previousPageType != pageType)
                NavigationHistory.Add(previousPageType);

            //await frame.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => frame.Navigate(pageType));

            frame.Navigate(pageType, parameter);
        }

        Window.Current.Activate();
    }

    /// <summary>
    /// Goes back.
    /// </summary>
    public void GoBack()
    {
        var content = Window.Current.Content;
        var frame = content as Frame;

        if (frame != null)
        {
            var currentPageType = frame.Content.GetType();

            // remove the previous page from the history

            var previousPageType = NavigationHistory.Last();
            NavigationHistory.Remove(previousPageType);

            // navigate back

            frame.Navigate(previousPageType, null);
        }
    }

    #endregion

    #region Private

    /// <summary>
    /// The navigation history.
    /// </summary>
    private List<Type> NavigationHistory { get; set; }

    #endregion

    #region Initialization

    public NavigationService()
    {
        NavigationHistory = new List<Type>();

        HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }

    /// <summary>
    /// Called when the back button is pressed; either navigates to the previous page or exits the application.
    /// </summary>
    private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {
        if (NavigationHistory.Count == 0)
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
            GoBack();
        }
    }

    #endregion
}

编辑:这是我的 ViewModelLocator

的一部分

在构造函数中:

SimpleIoc.Default.Register<MainViewModel>();

以及伴随的属性:

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

这将始终 return MainViewModel 的同一个实例(并且视图模型数据将持续存在)。