为什么当我第二次导航到 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);
}