簡體   English   中英

Caliburn.Micro 2.0並在Windows Phone 8.1 XAML中導航

[英]Caliburn.Micro 2.0 and navigating back in Windows Phone 8.1 XAML

假設我的頁面層次結構是

AViewModel-> BViewModel

在每一個視圖模型(注冊為PerRequest)我從服務器中加載數據OnActivate方法,並設置數據裝入一個標志(布爾私有類變量)。

在Windows Phone 8和Windows Phone 8.1 Silverlight中,當用戶從BViewModel導航到AViewModel時,然后在OnActivate中,ViewModel知道數據已經加載(標志為true),並且不執行任何操作。

這在Windows Phone 8.1中不起作用,因為每次用戶向后導航時,都會再次創建ViewModel(我可以看到構造函數調用)。

當我設置NavigationCacheMode=NavigationCacheMode.Required; 在所有視圖中,該標志在反向導航中均有效。 此解決方案的問題是,當我從BViewModel導航回到AViewModel時,該標記仍然存在,因此不會再次加載數據(沒關系),但是當我然后導航至BViewModel(使用不同的參數)時,則什么都不會發生,因為BViewModel未被銷毀,而是被重用,並帶有標志,表明不需要加載數據。

有沒有辦法使其表現與Windows Phone 8(或8.1 Silverlight)完全相同

看起來此問題的關鍵是要知道是否通過向后導航(使用“后退”按鈕)激活了頁面(ViewModel)。 我想出了一個似乎可行但不太優雅的解決方案。

我創建了App類一個布爾值屬性

public bool IsBackNavigation { get; private set; }

我在框架s導航”事件中設置的

frame.Navigating += (s, e) => IsBackNavigation = e.NavigationMode == NavigationMode.Back;

然后,ViewModel可以按以下方式訪問它

(App.Current as App).IsBackNavigation

此解決方案似乎可以與NavigationCacheMode=NavigationCacheMode.Required (或NavigationCacheMode=NavigationCacheMode.Enabled )一起使用。

但是,我有點擔心自動緩存,因此最好采用與Windows Phone 8具有相同功能的框架解決方案。

Github上對此問題進行了討論: https : //github.com/Caliburn-Micro/Caliburn.Micro/issues/51

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM