gpt4 book ai didi

silverlight - 如何在 MVVM 应用程序中实现撤消/重做?

转载 作者:行者123 更新时间:2023-12-04 20:58:10 25 4
gpt4 key购买 nike

我正在开发一个 Silverlight LoB 应用程序,设计师希望它有一个选项卡式界面,类似于 Visual Studio 的界面(我们可能会使用 Telerik Rad 控件来停靠选项卡)。完成原型(prototype)后,界面到目前为止运行良好,但我在思考如何在 MVVM 项目中实现撤消/重做功能时遇到问题。

撤消/重做功能必须:

  • 在撤消/重做时,恢复 UI 状态,
    即返回焦点,选择等到
    控件(例如文本框)
    变化的源头。
  • 有一个按 View 撤消/重做堆栈

  • 通常,我会使用命令模式,但我不确定如何将其应用于 MVVM。

    我已经使用命令和绑定(bind)来获得 View 和 View 模型的理想化松散耦合,但它使撤消/重做变得更加棘手,因为 View 模型没有任何 View 和状态的概念收到命令或更改绑定(bind)属性时的 View 。似乎我需要某种服务跟踪,只要用户执行某些可撤消的操作并获取状态以供以后恢复,该 View 就处于事件状态。

    对于在 MVVM 中实现撤消/重做的最佳实践是否有任何共识?我对 Daniel Vaughan 在他的 Calcium 项目中如何做到这一点很感兴趣。 Blend 显然是使用 MVVM 模式编写的,它的行为就像我希望我的应用程序那样,如果 MS 解释他们是如何做到的,那就太好了!

    最佳答案

    您需要做的第一件事是确保将操作与界面完全分开。这意味着将所有影响数据的操作转变为离散的操作。这也意味着任何导致观点改变的因素也应该被记录为一个离散的 Action 。基本上,界面的状态应该只反射(reflect)数据更改和基于命令的 View 更改(请参阅下面关于 View 更改的最后一条注释)。

    我们以前使用的最成功的撤消系统允许嵌套 IUndoableCommand 对象。这些复合命令汇总为单个用户操作(您希望在撤消菜单中看到的那种操作)。

    我注意到您提到跨 View 使用撤消...对于多格式应用程序来说,这似乎是不寻常的行为。通常撤消仅在单个控件内和任何拖放操作中。异常(exception)情况通常是基于图形的界面(不是基于表单的)。在撤消期间更改表单相当于将 MS Word 切换到另一个文档并继续撤消......对于最终用户来说非常令人不安。可能希望让用户体验人员重新考虑设计的这一方面。只值我的 2 美分。

    希望这可以帮助。

    关于silverlight - 如何在 MVVM 应用程序中实现撤消/重做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3567887/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com