如何以MVVM方式实现Windows通用应用程序的条件导航/重定向

时间:2014-07-31 07:58:13

标签: c# mvvm windows-8.1 windows-phone-8.1 win-universal-app

我有一个涉及登录的Windows通用应用程序。 这种应用的典型场景是不同的状态。例如,用户是否还没有第一次登录,或者用户是否已经登录过,只是再次重新打开应用程序。根据状态,这里是行动

IfLoggedIn - 显示主页 || IfNotLoggedIn - 显示登录页面

现在根据条件(状态),我们必须显示不同的页面。

我的问题与this类似,但我想了解如何在MVVM中实现相同的内容以及放置此条件逻辑的正确位置。

将它放在app.xaml.cs中可以解决问题但会弄乱你的app.xaml.cs并违反MVVM,因为ViewModel没有处理交互逻辑。

我尝试的解决方案是

  1. 创建一个中间页面(Intermediate.xaml)。
  2. 为上面的内容创建相应的ViewModel(IntermediateViewModel.cs)。
  3. 在此ViewModel的构造函数中,使用条件语句来决定要导航的页面。
  4. 让我们假设我在bool变量IsLoggedIn中有条件。在哪里进行有条件检查?

    我的IntermediateViewModel中的代码如下

    public bool IsLoggedIn {get; set;}
    //IsLoggedIn contains the condition of whether the user is logged-in or not-logged-in
    
    public IntermediateViewModel()
    {
        if (IsLoggedIn == false) 
        {
            NavigationService.Navigate("LoginPage");
        }
        else if (IsLoggedIn == true)
        {
            NavigationService.Navigate("HomePage");
        }
    }
    

    此解决方案的问题是,您的Backstack中还有一个页面(Intermediate.xaml)。有没有办法摆脱这个?

    This和类似的解决方案似乎不再与Windows Universal Apps(Windows 8.1 / Windows Phone 8.1)相关。

    有没有人知道如何以正确的方式使用MVVM实现这一点?

1 个答案:

答案 0 :(得分:1)

嗯,在这种情况下MVVM不成立,因为这应该在选择视图之前发生。为什么不创建一个包含逻辑的类('Navigator'或其他),并提供您在App中使用的属性('InitialPage')(而不是硬编码的初始值)页面)导航到第一页?通过这种方式,您可以将逻辑保留在App类之外,并且几乎不需要对其进行任何修改。