我在使用 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 实现命令处理器模式时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

正确的 MVVM 模式 WPF 命令实现

WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand

WPF:实现MVVM按钮命令

WPF 的综合指南:MVVM 与 MVP

wpf MVVM框架基础

Wpf MVVM ViewModel怎么控制View呢?