2016-06-10 112 views
0

我使用MvvmCross 3.5.1开发Win 8.1应用程序。用户按顺序浏览一些视图并返回到最后一个视图的第一个视图。在工作流的第一次迭代期间,一切都很完美。但是当用户再次启动工作流时 - 不会调用viewmodels中的Init()方法。当我第二次导航到ViewModel时,为什么不调用Init()方法?

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

FirstViewModel:

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

SecondViewModel:

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

那么简单,但只能一次性:(

什么原因,可能需要这样的行为


由于w^orkaround我试图加载视图模型“手动”:

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); 

它与初始化解决了这个问题()方法调用。但我不知道如何使用变量显示视图模型。有谁知道?


道歉为我可怜的英语,并提前致谢!

+0

我不知道mvvmcross,但我认为你正在寻找“装载”方法或“装载“事件。 – Kilazur

+0

可能除非你明确地销毁它已经初始化的视图,并且在返回时从内存拉回来,而不是重新初始化。 –

+0

这篇文章可能会让你感兴趣:http://stackoverflow.com/questions/17857543/mvvmcross-viewmodel-caching-and-re-initializing – momar

回答

1

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

你可以使自己的BasePage它通过重写的OnNavigatedTo覆盖此行为:

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

    base.OnNavigatedTo(e); 
} 
+1

第4行的代码示例必须以分号结尾。无法修改您的答案,因为修改必须更改至少6个字符。 –

+0

谢谢Cheesebaron!它解决了我的问题。现在我开始出现其他类型的错误,但Init()的主要问题已解决。 –

相关问题