第二十四章:頁面導航(五)

導航變化

當您嘗試使用ModalEnforcement和MvvmEnforcement程序時,您可能會對模態頁面未能保留任何信息感到不安。我們都遇到了導航到用於輸入信息的頁面的程序和網站,但是當您離開該頁面然後再返回時,您輸入的所有信息都消失了!這樣的頁面可能非常煩人。
即使在像ModalEnforcement和MvvmEnforcement這樣的簡單演示示例中,也可以通過僅創建模態頁面的單個實例(可能在程序啓動時 - 然後在整個過程中使用該單個實例)來非常輕鬆地解決該問題。
儘管這種解決方案顯而易見,但它對於保留頁面信息的問題並不是一個很好的通用方法。除最簡單的情況外,應該避免使用這種技術。保持大量頁面處於活動狀態可能會導致內存問題,您必須小心避免在導航堆棧中多次使用相同的頁面實例。
不過,這裏是如何修改此技術的ModalEnforcementHomePage代碼隱藏文件:

public partial class ModalEnforcementHomePage : ContentPage
{
    ModalEnforcementModalPage modalPage = new ModalEnforcementModalPage();
    public ModalEnforcementHomePage()
    {
        InitializeComponent();
    }
    async void OnGoToButtonClicked(object sender, EventArgs args)
    {
        await Navigation.PushModalAsync(modalPage);
    }
}

ModalEnforcementHomePage將ModalEnforcementModalPage的實例保存爲字段,然後始終將該單個實例傳遞給PushModalAsync。
在不太簡單的應用程序中,這種技術很容易出錯:有時,應用程序中的特定類型的頁面可以從幾個不同的頁面導航到,這可能會導致兩個單獨的,不一致的ModalPage實例。
如果您需要在程序終止時保存程序的狀態並在程序再次執行時將其還原,則此技術將完全崩潰。您無法自行保存和還原頁面實例。通常是與頁面關聯的數據必須保存。
在現實生活中,ViewModels通常構成多頁面應用程序中頁面類型的主幹,而應用程序保留頁面數據的最佳方式是通過ViewModel而不是頁面。
使用MvvmEnforcement可以演示在連續多次調用模式頁面時維護頁面狀態的更好方法。首先,將屬性添加到LittleViewModel的App頁面,並在App構造函數中實例化該類:

namespace MvvmEnforcement
{
    public class App : Application
    {
        public App()
        {
            ModalPageViewModel = new LittleViewModel();
            MainPage = new NavigationPage(new MvvmEnforcementHomePage());
        }
        public LittleViewModel ModalPageViewModel { private set; get; }
    __
    }
}

由於LittleViewModel僅實例化一次,因此它會在應用程序的持續時間內維護信息。 然後,MvvmEnforcementModalPage的每個新實例都可以簡單地訪問此屬性並將ViewModel對象設置爲其BindingContext:

public partial class MvvmEnforcementModalPage : ContentPage
{
    public MvvmEnforcementModalPage()
    {
        InitializeComponent();
        LittleViewModel viewModel = ((App)Application.Current).ModalPageViewModel;
        BindingContext = viewModel;
        // Populate Picker Items list.
        foreach (string language in viewModel.Languages)
        {
            picker.Items.Add(language);
        }
    }
    __
}

當然,一旦程序終止,信息就會丟失,但App類也可以將這些信息保存在Application的Properties屬性中 - 這是第6章“按鈕點擊”結束時PersistentKeypad程序中首次演示的技術 - 和 然後在應用程序再次啓動時檢索它。
保留數據和在頁面之間傳遞數據的問題將佔據本章後面部分的重點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章