在上一篇的文章中,對頁面常規的導航做一些分享,然而在實際的編程中,頁面數據的保持,傳值等等都有很多,這篇文章就對這些相關內容做一個分享和記錄,有問題,希望大家留言指正。這一篇從實現業務邏輯來講並沒有什么特別的,這里主要是說說通過Properties和生命周期實現數據的“保持”。當然這里遇到了一個讓我懵逼的問題,電子書中介紹說,Properties的值是會一直保持的,直到App卸載,但是在我的安卓機中實驗,程序終止后,值就為空了,不知是我看掉了什么東西還是怎么了,不知道大家有沒有遇到這個問題,希望在留言中分享下。
先從一個小實例說起吧,比如有一個電商網站,當用戶從商品詳細頁點擊購買的時候,會提示叫用戶登錄,登錄成功后會跳轉到訂單頁面,用戶會填入一些信息(地址,聯系電話等等),但是這個時候用戶發現不包郵,不打算再買這個商品了,用戶點擊返回的時候,我們不希望他在回到登錄頁面,這個時候只需在登錄頁面中調用Pop就行了,如下就自動會從page stack中移除登錄頁了:
await Navigation.PopAsync();
繼續,如用戶繼續覺得這個商品是個急需的東西,那10元的郵費是可以承受的,他又返回了訂單頁,得,先前的填寫的數據都不在了,從用戶體驗來講,肯定是不好的,那怎么才能實現數據保持呢,推薦的常用的有兩種方法:
第一種就是使用Application的Properties的屬性,這是一個IDictionary<string, object>類型的字典型,雖然value是個object類型,但是還是建議做一個約束,使用C#的一些基本類型(如int、string。。。),電子書原文為:
Also, you should restrict the data types used with Properties to the basic data types supported by .NET and C#, such as string, int, and double.
調用方式如下:
//App.cs方法中的調用
Properties["Test"] = "Test Properties"; //在其他頁面的調用 Label01.Text = Application.Current.Properties["Test"].ToString();
在App類中有三個方法的重寫即OnStart、OnSleep和OnResume,這個三個當中呢,一般來說OnSleep比較重要點,用的較多。
這里插一下,程序啟動后是先調用App的構造函數,然后才調用OnStart
當按下Home鍵的時候程序會調用OnSleep的重寫,這個時候我們就可以把中間類或者把App類中相關的屬性進行“保持”。簡單示例如下:
protected override void OnSleep() { // Handle when your app sleeps Properties["Transient"] = "Test Properties"; }
但是訂單數據這類的數據並不建議用或者說不建議直接用Properties,這類數據的保持建議用第二種,即ViewModel,這也是官方建議的,Properties比較適合用戶設置類的數據,比如說顏色、背景啊之類的。使用ViewModel呢當然不能像正常的那樣在當前頁面new,下面的代碼做一個簡單的演示吧:
public class App:Application { public OrderViewModel OrderViewModel {get;private set;} public App() { .... OrderViewModel = new OrderViewModel(); } } //OrderPage public OrderPage() { BindingContext = (Application.Current as App).OrderViewModel; }
這種方式我想大家都還是比較了解,還有頁面間傳值就不多說了,無非也就是構造函數、屬性、方法、事件、中間類這些方式,唯一不同的是Xamarin自己給自己代鹽了個MessagingCenter類(其實還有ViewModelBase,簡單點說就是他自己實現了一套MVVM的框架),在WPF或者Silverlinght中用過第三方MVVM框架的應該沒什么難度的。
好吧,這次就這樣了。。。