【问题标题】:How do I navigate to a different page from a command class如何从命令类导航到不同的页面
【发布时间】:2015-08-22 21:50:59
【问题描述】:

所以我有一个只有一个按钮的登录页面。当您单击该按钮时,将触发一个命令,该命令获取用户名和密码并获取一个身份验证令牌。我想弄清楚的是如何处理命令的结果。例如,如果失败,我想显示一个对话框,但如果成功,我希望它导航到不同的页面。

我感到困惑的地方是我可以在哪里获得对页面的引用,以便我可以打开该对话框或导航离开。命令类引用了视图模型,但我的视图模型是在 XAML 中声明的,而不是在代码隐藏中。或者可能以某种方式将 CommandParameter 绑定到视图的实例?

我做错了吗?这听起来很臭吗?我对 XAML 比较陌生,所以我不知道规范是什么。任何帮助表示赞赏。

【问题讨论】:

  • 你的意思是使用MVVM?还是面向标准事件的?
  • MVVM。我正在尝试完全避免代码隐藏。

标签: .net xaml win-universal-app


【解决方案1】:

使用 MVVM 的导航通常是最复杂的部分,我推荐

1.- 带有视图名称的视图枚举(MainView、DetailsView)

public enum AppViews
{
    MainView,
    DetailsView
}

2.- 一个名为 INavigation 的接口,其中包含一个方法 Navigate(Views view)

public interface INavigation
{
    void Navigate(AppViews view);
}

3.- 包含当前 INavigation 实例为静态的类:

public class NavigationLocator
{
    static INavigation Current { get; set; }
}

(这取决于您的 ViewModel、PCL、windows 等是如何定义的)

4.- 在 App 类中实现 INavigation:

 public void Navigate(AppViews view)
    {
        var type = Type.GetType("ProjectName." + view.ToString());

        rootFrame.Navigate(type, null);
    }

5.- 在应用构造函数中

  public App()
  {
     NavigationLocator.Current = this;
  }

6.- 调用你的 MVVM

NavigationLocator.Current.Navigate(AppViews.DetailsView);

就是这样。

【讨论】:

  • 这与仅在 Window.Current.Content 上调用 Navigate 方法有何不同?还是我只是回答了我自己的问题?
  • 在这种情况下,您没有使用纯 MVVM,因为您使用的是 Window 类,而不是使用接口抽象它,(想象另一个平台,而不是 Window 类可能是 Activity 类)ViewModel 将是相同,只有 View 部分发生变化
  • 在 App.cs 中似乎无法访问根框架,所以我基本上必须按照我之前所说的 (Window.Current.Content) 来获取根框架——最大的区别是我将它从命令中抽象出来并使用定位器。对吗?
  • 是的,或者只是在 App.xaml.cs 中提取它的 rootFrame 实例,它在 Frame rootFrame 之外实例化; protected override void OnLaunched(LaunchActivatedEventArgs e) { ... rootFrame = Window.Current.Content as Frame;} 你就拥有了。是一样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多