2016-06-10 90 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()的主要問題已解決。 –

相關問題