基于WPF + CommunityToolkit.Mvvm实现自定义Undo/Redo命令的最优方案
图形编辑器Undo/Redo实现方案对比与选择
方案1:基于ICommand/RelayCommand,主ViewModel维护命令栈
- 优势:实现门槛低,逻辑直接。不需要额外架构层,ViewModel直接管理命令的执行、入栈出栈,适合快速落地小型项目。
- 劣势:命令栈与ViewModel强耦合,ViewModel职责过载(既要管画布逻辑,又要管Undo/Redo栈)。后续如果要加多画布、多编辑会话,或者在其他模块复用Undo/Redo能力,几乎要重构整个逻辑。
方案2:独立会话仓库+服务化实现
- 优势:职责分离清晰——会话仓库专门存命令栈,服务层封装Register/Execute/Undo等核心逻辑,ViewModel只需要调用服务接口即可。这种架构天然支持多会话(比如多画布各自的编辑历史),也能轻松扩展历史记录持久化、跨模块复用Undo/Redo能力,长期维护成本低。
- 劣势:初期需要搭建仓库和服务的基础架构,比方案1多写一些代码,但这些成本在项目迭代中会快速回本。
选择建议
如果你的编辑器是小体量、需求单一(单画布,无后续扩展计划),方案1足够用;如果考虑长期迭代、需要扩展复杂功能,方案2是更稳妥的选择,能避免后期因架构限制被迫重构的麻烦。
内容的提问来源于stack exchange,提问作者Alexey Rodionov
相关产品推荐
相关产品推荐

