为什么当我第二次导航到 ViewModel 时没有调用 Init() 方法?
Why Init() method is not called when I navigate to the ViewModel second time?
我使用 MvvmCross 3.5.1 开发 Win 8.1 应用程序。用户依次浏览一些视图和 returns 从最后一个视图到第一个视图。在工作流的第一次迭代中,一切都完美无缺。但是当用户再次启动工作流时 - 不会调用视图模型中的 Init() 方法。
例如,FirstViewModel 和 SecondViewModel 之间的交互如下所示。
第一视图模型:
ShowViewModel<SecondViewModel>(
new
{
code = ItemCode,
descr = ItemDescription
});
第二个视图模型:
public void Init(string code, string descr)
{
...
}
如此简单,但只工作一次:(
什么原因可能导致这种行为?
作为解决方法,我尝试加载视图模型 "manually":
var d = new Dictionary<string, string>
{
{"code", ItemCode},
{"descr", ItemDescription}
};
var b = new MvxBundle(d);
var r = new MvxViewModelRequest<SecondViewModel>(b, null, null);
var m = Mvx.Resolve<IMvxViewModelLoader>().LoadViewModel(r, null);
解决了Init()方法调用的问题。但我不知道如何使用 m 变量显示视图模型。有人知道吗?
抱歉我的英语不好,提前致谢!
Init() 仅被调用一次,因为 Windows 8.1 应用缓存页面。因此,该页面的 ViewModel 不会被销毁,因此不会再次调用 Init() 方法。
您可以创建自己的 BasePage,它通过覆盖 OnNavigatedTo:
来覆盖此行为
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.NavigationMode == NavigationMode.New)
ViewModel = null;
base.OnNavigatedTo(e);
}
我使用 MvvmCross 3.5.1 开发 Win 8.1 应用程序。用户依次浏览一些视图和 returns 从最后一个视图到第一个视图。在工作流的第一次迭代中,一切都完美无缺。但是当用户再次启动工作流时 - 不会调用视图模型中的 Init() 方法。
例如,FirstViewModel 和 SecondViewModel 之间的交互如下所示。
第一视图模型:
ShowViewModel<SecondViewModel>(
new
{
code = ItemCode,
descr = ItemDescription
});
第二个视图模型:
public void Init(string code, string descr)
{
...
}
如此简单,但只工作一次:(
什么原因可能导致这种行为?
作为解决方法,我尝试加载视图模型 "manually":
var d = new Dictionary<string, string>
{
{"code", ItemCode},
{"descr", ItemDescription}
};
var b = new MvxBundle(d);
var r = new MvxViewModelRequest<SecondViewModel>(b, null, null);
var m = Mvx.Resolve<IMvxViewModelLoader>().LoadViewModel(r, null);
解决了Init()方法调用的问题。但我不知道如何使用 m 变量显示视图模型。有人知道吗?
抱歉我的英语不好,提前致谢!
Init() 仅被调用一次,因为 Windows 8.1 应用缓存页面。因此,该页面的 ViewModel 不会被销毁,因此不会再次调用 Init() 方法。
您可以创建自己的 BasePage,它通过覆盖 OnNavigatedTo:
来覆盖此行为protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.NavigationMode == NavigationMode.New)
ViewModel = null;
base.OnNavigatedTo(e);
}