【发布时间】:2020-03-29 20:57:41
【问题描述】:
我想使用 UWP 中的导航功能。不幸的是,Navigate 方法的参数是一个类型,而不是一个页面的实例。看起来这种类型的激活是在幕后完成的。我质疑设计决策,但我的直接问题是我所有的 MVVM 表单都是用视图模型实例化的。通常我使用依赖注入容器创建页面。
当页面具有 DI 构造函数时,如何在 UWP 中使用 Navigate 方法创建页面?
【问题讨论】:
我想使用 UWP 中的导航功能。不幸的是,Navigate 方法的参数是一个类型,而不是一个页面的实例。看起来这种类型的激活是在幕后完成的。我质疑设计决策,但我的直接问题是我所有的 MVVM 表单都是用视图模型实例化的。通常我使用依赖注入容器创建页面。
当页面具有 DI 构造函数时,如何在 UWP 中使用 Navigate 方法创建页面?
【问题讨论】:
当这些页面具有 DI 构造函数时,当它们与
Navigate方法一起使用时,如何在 UWP 中创建页面?
您可以将Frame 的Content 设置为您自己创建的实例,而不是尝试根据其类型导航到该页面:
rootFrame.Content = new YourPage(yourDependency);
另一种选择是确保所有页面都有一个默认的无参数构造函数,并将依赖项注入其他地方,例如@Richard Zhang - MSFT 建议的 OnNavigatedTo 方法。
【讨论】:
在 UWP 中,Frame.Navigate 的导航参数是Type,而不是实例。这真是一个设计。
其实在UWP中导航不需要实例,也不需要DI,一般情况下如果需要Page和ViewModel结合,可以这样:
1.在页面构造函数中初始化ViewModel
框架
MyFrame.Navigate(typeof(MyPage));
我的页面
private MyViewModel vm;
public MyPage()
{
this.InitializeComponent();
vm = new MyViewModel();
}
2。导航时通过传参初始化ViewModel
框架
var vm = new MyViewModel();
MyFrame.Navigate(typeof(MyPage), vm);
我的页面
private MyViewModel vm;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if(e.Parameter!=null && e.Parameter is MyViewModel _vm)
{
vm = _vm;
// do other things
}
}
如果要复用页面,可以开启页面缓存,它会保存当前页面状态(包括ViewModel),下次导航到页面时使用缓存,避免重复创建@987654332 @。
public MyPage()
{
this.InitializeComponent();
NavigationCacheMode = NavigationCacheMode.Enabled;
}
最好的问候。
【讨论】: