【问题标题】:Implementing State handling in windows 8 using MVVM Light使用 MVVM Light 在 Windows 8 中实现状态处理
【发布时间】:2012-07-29 16:24:30
【问题描述】:

我如何使用 mvvm light 实现状态处理(运行/恢复/终止状态)。我面临的主要问题是导航。我完全不受导航堆栈的控制。我如何使用 MVVM Light 有效地管理它。

【问题讨论】:

  • 如何将视图模型连接到视图?您可以创建一个由所有页面视图模型扩展的基本视图模型类,该类公开在应用程序状态更改时调用的虚拟方法,以便您的视图模型可以响应这些事件。
  • 我做到了。但我的问题是,当我的应用程序下降到终止状态时,我所有的状态信息都丢失了。在通常情况下,VS12 使用一个名为“SuspensionManager”的类来处理这个问题和默认导航。我的疑问是如何使用 SuspensionManager 类的行为来实现基于 mvvmlight 的结构。主要问题是恢复活动框架和导航堆栈..
  • @Filip:你可以在这里找到我的实现:dropbox.com/sh/px60d6q2snimbv3/qJ0Zw6r2Zx

标签: windows-8 mvvm-light windows-runtime


【解决方案1】:

使用 GridView 或 SplitView 模板开始一个新项目,并查看 Common 文件夹中的 SuspensionManager.cs。它有一个名为 RegisterFrame 的方法,当被调用时,它开始跟踪框架中的所有导航事件,并在应用程序暂停和恢复时尝试保存关闭和恢复状态。

应用程序主框架在 App.OnLaunched (App.xaml.cs) 中向 SuspensionManager 注册,并在 App.OnSuspending 中完成保存。

最后,看看 LayoutAwarePage.cs,也在 Common 文件夹中。您可以从 LayoutAwarePage 继承来获得 Portrait 和 Snapped 设计时支持。它还尝试通过利用 SuspensionManager 来处理导航状态缓存。因此,无论您的页面是从另一个页面导航到的还是作为简历的一部分,都会使用正确的数据调用虚拟方法 LoadState

显然,这种模式是直接在页面本身中管理导航状态,但您可以调整这种模式以创建一种“SuspensionService”,您的 ViewModel 可以以同样的方式利用它。

【讨论】:

  • 你能根据我的实现帮助我吗,你可以在这里找到我的代码:dropbox.com/sh/px60d6q2snimbv3/qJ0Zw6r2Zx
  • 我只是假设导航状态是 MVVM 堆栈中视图的一部分,然后如果您使用 MVVM Light 并不重要,因为您只是在恢复视图的状态。无论如何,您的导航服务都依赖于视图。您可以在基本视图模型类上添加方法,当导航事件发生时,这些方法将由基本页面类调用,因此视图模型知道何时保存/恢复其状态。此外,您可以使用 Messenger 类在状态更改事件发生时发布它们并在视图模型中订阅这些事件,以便它们能够做出适当的响应
  • @Flip :您能否推荐一些示例或文档以供参考。我是这个世界的新手,很难适应这个新世界。如果您建议一些代码示例,我将不胜感激。感谢您的回复。跳你会帮助我进一步实现我的目标。stz
  • 嗨 Jared :提供一些示例而不是对话。
  • @Flip:嗨,Flip,我想你之前已经试过了。能否贴一些代码sn-ps,对我们有帮助。我的项目中也有类似的问题。期待积极的重播。
【解决方案2】:

您可能对 CodePlex 和 NuGet 上免费提供的开源 Okra App Framework 感兴趣(免责声明:我是该项目的首席开发人员)。这是从头开始为 Windows 8 应用程序设计的,特别是那些使用 MVVM 模式的应用程序(您仍然可以使用 MVVM Light 基类来定义您的视图模型)。

它特别感兴趣,

  • 了解 Windows 8 导航模型的导航管理器
  • 可在应用程序终止时自动保持其状态的导航堆栈
  • 一种让视图模型保持其自身状态的机制(通过一个简单的接口)
  • 自动视图和视图模型构建和连接(默认使用 MEF 属性)

【讨论】:

  • 嗨,它看起来很有前途??我可以在我的项目模板中重用您的代码吗?有版权问题吗?你所有的植入物看起来都很棒。我发现唯一缺少的是缺乏对“事件聚合功能”的支持。如果你也包含它。我相信它会成为一个冲击波。可以提供一些示例实现应用程序。那么它对像这样的初学者有很大帮助我。
  • @StezPet:是的。 Okra App Framework 是在 Ms-PL 许可下发布的,这意味着您可以随心所欲地使用代码(在合理范围内!)。关于事件聚合,我目前正在避免这种情况,因为 Okra 旨在与 MVVM 框架一起很好地工作,而不是完全替换(您始终可以为此目的使用 MVVM light)。对于示例代码,请查看较早的源代码提交之一 - 我从主下载中删除了一个示例应用程序,并打算在将来单独发布它(并且还打算彻底检查文档)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多