如果你的WP應用已經使用了Sterling資料庫,那就順便用Sterling實現墓碑化(Tombtsone)吧。Jeremy Likness的blog詳細說明了如何在MVVM架構中使用Sterling實現Tombstone。主要有幾點:
1. 定義一個Tombstone資料類。其中用到了Sterling User Guide中提到的Singletone Serialization
public class TombstoneModel{ public TombstoneModel() { State = new Dictionary<string, object>(); } public Dictionary<string, object> State { get; set; } public T TryGet<T>(string key, T defaultValue) { if (State.ContainsKey(key)) { return (T)State[key]; } return defaultValue; }}
2. 定義一個ITombstoneable介面。其中有Active與Deactive方法,分別於view的NavigatedTo方法,NavigatedFrom方法中調用。
在Deactive方法中儲存Tombstone資料類到資料庫,在Active方法中取出Tombstone資料, 用於恢複view model的狀態。
3. 在需要Tombstone的view model上實現該介面
很多情況下,View Model需要View Loaded之後才可工作,Jeremy使用了一個匿名事件處理在Loaded之後執行Active方法。
public static void ActivatePage(this PhoneApplicationPage phonePage, IViewModel viewModel){ RoutedEventHandler loaded = null; loaded = (o, e) => { ((PhoneApplicationPage) o).Loaded -= loaded; if (viewModel is ITombstoneFriendly) { ((ITombstoneFriendly) viewModel).Activate(); } }; phonePage.Loaded += loaded;}protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){ this.ActivatePage(GlobalManager.GetViewModel<IMainViewModel>()); base.OnNavigatedTo(e);}
此外,Sterling目前還不支援IList的序列化,Active之後會發現該集合的項目均為null,討論群組中提到了這個問題,可用List代替而解決。