我在使用 MVVM for WPF 实现命令处理器模式时遇到问题
Posted
技术标签:
【中文标题】我在使用 MVVM for WPF 实现命令处理器模式时遇到问题【英文标题】:I'm having an issue implementing the Command Processor pattern using MVVM for WPF 【发布时间】:2022-01-11 21:11:26 【问题描述】:我正在尝试使用用于 WPF 的 MVVM 实现命令处理器模式。我大致遵循的命令处理器模式是 Pattern-Oriented Software Architecture (Volume 1) 一书中描述的模式:
命令处理器设计模式将请求分开 从它的执行服务。命令处理器组件管理 请求作为单独的对象,安排它们的执行,并提供 附加服务,例如存储请求对象以供以后使用 撤消。
我的实现要求将所有可能撤消的 UI 操作存储为命令。这主要与 WPF 的命令兼容,文本框除外。 WPF 中的文本框不提供命令(与按钮和复选框不同)。
我想我通过添加一个TextChangedCommand
来解决这个问题,它在引发TextChanged
事件时执行,如下所示:
<l:CommandTextBox
Text="Binding Name, UpdateSourceTrigger=PropertyChanged"
TextChangedCommand="Binding SetNameCommand, Mode=OneWay"
/>
但问题是TextChangedCommand
不仅在用户进行更改时执行,而且在数据绑定属性更改时执行,这发生在撤消更改时。在撤消操作中,我只想将属性设置为之前的状态,而不是再次运行命令。
好像需要一个TextChangedByUserCommand
,但在我尝试实现它之前,我想知道我是否以错误的方式解决这个问题,或者是否有人提出了更清洁的解决方案。
【问题讨论】:
【参考方案1】:我的第一选择是跟踪撤消更改的操作并对更改做出反应。
private void ResetCommandTextbox()
//some stuff...
IsViewModelUndoing = true;
Name = oldValue;
IsViewModelUndoing = false;
public void TextChangedCommand(...)
if(IsViewModelUndoing)
return;
// your other stuff which your doing
【讨论】:
以上是关于我在使用 MVVM for WPF 实现命令处理器模式时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章