命令模式 - 文本框问题中的撤消功能

Command pattern - undo function in textbox issue

我有几个共享同一个 TextChanged 侦听器的文本框。

private void text1_TextChanged(object sender, TextChangedEventArgs e)
{
    CommandManager.InvokeExecute(new SaveUpdateCommand((TextBox)sender));
}

当事件发生时,旧的 TextBox 对象被放入堆栈:

internal static class CommandManager
{
    private static Stack<Command> commandStack = new Stack<Command>();

    internal static void InvokeExecute(Command cmd)
    {
        cmd.Execute();
        commandStack.Push(cmd);
    }

    internal static void InvokeUndo()
    {
        if (commandStack.Count > 0) commandStack.Pop().Undo();
    }
}

然而,要使撤消生效,我需要单击 InvokeUndo 按钮两次,但我不明白为什么。除了必要的双击外,一切都很好。这是命令实现。

internal class SaveUpdateCommand : Command
{
    private TextBox textBox;
    private string oldText;

    public SaveUpdateCommand(TextBox textBox)
    {
        this.textBox = textBox;
        this.oldText = textBox.Text;
    }

    internal override void Execute()
    {
        //Not implemented within this command.
    }

    internal override void Undo()
    {
        textBox.Text = oldText;
    }
}

感谢您的任何见解。 GUI 是使用 VS2015 设计器和 WPF 完成的。

我很久以前就写过这样的 undo/do-again class && 发现 和你完全一样的错误

恕我直言,这取决于以下内容:

  • 您更改文本框的文本
  • 文本框触发 exe 命令: <------------------------------+
    • 您的列表获得一个新项目,命令项目为 |
    • 命令项包含实际文本 |
  • 现在您单击undo按钮:|
    • 您收到文本框的旧文本 |
    • 您将旧文本分配给文本框 |
    • 将旧文本分配给文本框文本明显改变 |
    • 文本框发送新的 exe 命令 ------------------------+
    • 现在列表中又出现了您正在查看的相同项目

这就是为什么在您认为文本发生变化之前必须双击 undo 按钮...

实际上文本已更改,但由于它保持不变,您不会被任何人识别UI更新.

看到漂亮的 ASCII 箭头了吗?? ^^