命令模式中的属性

时间:2018-02-27 12:18:43

标签: c# wpf mvvm undo command-pattern

我们如何处理命令模式中的简单公共属性设置器以使其可撤消?我是否需要为每个属性创建单独的命令?

详细

我的应用程序(WPF / MVVM / C#)目前通过维护一堆“状态快照”来实现撤消/重做功能。这些快照是在每个可撤消操作时创建的,并推送到堆栈。虽然到目前为止这种方法已经正常工作,但是撤消堆栈的大小仍在不断膨胀,使应用程序响应性降低

我现在正在考虑转向标准命令模式的前景。由于我已经在使用MVVM Light,我只是将RelayCommand扩展为创建UndoableRelayCommand,然后将它们推送到我的撤销堆栈而不是快照。到目前为止一切都很好。

然而问题是许多VM级对象直接绑定到UI控件(通过标准WPF Binding),因此直接设置而不涉及任何RelayCommand。设置这些属性需要是可撤消的操作。如何使这个要求符合标准命令模式,同时保持我的Bindings完好无损?

1 个答案:

答案 0 :(得分:0)

我建议你仍然将值复制到命令中,因为否则旧的命令会在它们发生时与绑定的状态不同步。

我认为你已经只拍摄受影响价值的快照,而不是整个表格(这将是一个大错)。

我不明白应用程序变得反应迟钝是什么意思。撤消/重做堆栈上的所有操作都应为O(1)。如果您的实施比O(1)更复杂,那么在重新设计机制之前,这可能是您调查的方向。

无论如何,使用undo / redo堆栈,通常会在较大的应用程序中应用一个实用技巧。绑定堆栈的大小。推出更多物品,让它忘记"最古老的。另外一个实用的技巧是每次持久状态时清除堆栈,只保留最后一个命令重做。这些是我到目前为止看到的性能调整。