Windows Phone - 使用Sterling数据库实现墓碑化(Tombstone)[zhuan]

如果你的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代替而解决。

你可能感兴趣的:(windows phone)