如何正确保存页面的viewmodel来处理墓碑

时间:2011-01-07 10:22:40

标签: mvvm windows-phone-7 tombstoning

我正在构建一个WP7应用程序,现在我正处理它的墓碑部分。

我正在做的是在NavigatedFrom事件发生时在Page.State包中保存页面的viewmodel,并在NavigatedTo中读回它(通过一些检查来检测我是否应该从包中读取或从中读取应用程序的真实实时数据。)

首先我的VM只是域模型的包装器

public string Nome
    {
        get
        {
            return _dm.Nome;
        }
        set
        {
            if (value != _dm.Nome)
            {
                _dm.Nome= value;
                NotifyPropertyChanged("Nome");
            }
        }
    }

但这并不总是有效,因为当保存到包中然后回读时,域模型没有正确反序列化。

然后我将我的VM实现改为仅仅是DM所需属性的副本:

public string Nome
    {
        get
        {
            return _nome;
        }
        set
        {
            if (value !=nome)
            {
                _nome= value;
                NotifyPropertyChanged("Nome");
            }
        }
    }

并使用构造函数:

_nome = dm.Nome;

现在它有效,但我不确定这是否是正确的方法。

THX 西蒙

3 个答案:

答案 0 :(得分:2)

任何瞬态状态信息都应该保存在Application.Deactivated事件中,然后在Application.Activated事件中恢复以进行逻辑删除支持。

如果您需要在应用程序会话之间存储任何内容,那么您可以使用Application.Closing事件,但根据您需要存储的内容,您可以随时更改它。同样,根据您需要存储的内容,您可以在Application.Launching事件中恢复它,或者只在需要时读取它。

您采用的方法完全取决于您的应用程序的要求,您存储数据的方法和位置也取决于您(通常接受二进制序列化到隔离存储的速度最快)。

我不知道您的应用程序的详细信息,但如果您希望实现对墓碑的支持,则在NavigatedFrom / NavigatedTo中保存和恢复数据不太可能是正确的地方。

答案 1 :(得分:1)

我建议不要制作模型的一部分副本,因为在处理墓碑时,您(可能)需要同时保留完整(应用级别)模型和页面级别副本。

Again最合适的解决方案将取决于您的应用程序及其使用的模型的复杂程度。

答案 2 :(得分:1)

Application.Activated / Deactivated是处理墓碑的好地方。

了解为什么OnNavigatedTo / From可能不适合您的需求。

How to correctly handle application deactivation and reactivation - Peter Torr's Blog

Execution Model Overview for Windows Phone