我们如何处理命令模式中的简单公共属性设置器以使其可撤消?我是否需要为每个属性创建单独的命令?
我的应用程序(WPF / MVVM / C#)目前通过维护一堆“状态快照”来实现撤消/重做功能。这些快照是在每个可撤消操作时创建的,并推送到堆栈。虽然到目前为止这种方法已经正常工作,但是撤消堆栈的大小仍在不断膨胀,使应用程序响应性降低
我现在正在考虑转向标准命令模式的前景。由于我已经在使用MVVM Light,我只是将RelayCommand
扩展为创建UndoableRelayCommand
,然后将它们推送到我的撤销堆栈而不是快照。到目前为止一切都很好。
然而问题是许多VM级对象直接绑定到UI控件(通过标准WPF Binding
),因此直接设置而不涉及任何RelayCommand
。设置这些属性需要是可撤消的操作。如何使这个要求符合标准命令模式,同时保持我的Bindings完好无损?
答案 0 :(得分:0)
我建议你仍然将值复制到命令中,因为否则旧的命令会在它们发生时与绑定的状态不同步。
我认为你已经只拍摄受影响价值的快照,而不是整个表格(这将是一个大错)。
我不明白应用程序变得反应迟钝是什么意思。撤消/重做堆栈上的所有操作都应为O(1)
。如果您的实施比O(1)
更复杂,那么在重新设计机制之前,这可能是您调查的方向。
无论如何,使用undo / redo堆栈,通常会在较大的应用程序中应用一个实用技巧。绑定堆栈的大小。推出更多物品,让它忘记"最古老的。另外一个实用的技巧是每次持久状态时清除堆栈,只保留最后一个命令重做。这些是我到目前为止看到的性能调整。