【问题标题】:Why Init() method is not called when I navigate to the ViewModel second time?为什么当我第二次导航到 ViewModel 时不调用 Init() 方法?
【发布时间】:2016-06-10 10:52:16
【问题描述】:

我使用 MvvmCross 3.5.1 开发 Win 8.1 应用程序。用户依次浏览一些视图并从最后一个视图返回到第一个视图。在工作流程的第一次迭代期间一切正常。但是当用户再次启动工作流时 - 视图模型中的 Init() 方法不会被调用。

例如,FirstViewModel 和 SecondViewModel 之间的交互如下所示。

FirstViewModel:

ShowViewModel<SecondViewModel>(
    new
    {
        code = ItemCode,
        descr = ItemDescription
    });

第二视图模型:

public void Init(string code, string descr)
{
    ...
}

如此简单,但只能使用一次 :(

什么原因可能导致这种行为?


作为解决方法,我尝试“手动”加载视图模型:

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 变量显示视图模型。有谁知道吗?


为我糟糕的英语道歉并提前感谢!

【问题讨论】:

  • 我不了解 mvvmcross,但我认为您正在搜索“Load”方法或“Loaded”事件。
  • 可能除非你明确地销毁它已经初始化的视图,并在返回时从内存中拉回,而不是重新初始化。
  • 您可能会对这篇文章感兴趣:stackoverflow.com/questions/17857543/…

标签: c# windows-8.1 mvvmcross


【解决方案1】:

Init() 只被调用一次,因为 Windows 8.1 应用程序缓存页面。因此,该页面的 ViewModel 不会被销毁,因此不会再次调用 Init() 方法。

您可以创建自己的 BasePage,通过覆盖 OnNavigatedTo 来覆盖此行为:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.NavigationMode == NavigationMode.New)
        ViewModel = null;

    base.OnNavigatedTo(e);
}

【讨论】:

  • 代码示例的第 4 行必须以分号结尾。无法编辑您的答案,因为编辑必须更改至少 6 个字符。
  • 感谢 Cheesebaron!它解决了我的问题。我现在开始遇到其他类型的错误,但 Init() 的主要问题已解决。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多