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

时间:2015-12-15 21:38:11

标签: c# wpf command-pattern

我有几个TextBox,它们共享相同的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按钮,我无法弄清楚原因。除了必要的双击一切都很好。这是Command实现。

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是使用带有WPF的VS2015设计器完成的。

1 个答案:

答案 0 :(得分:1)

很久以前我写过这样一个undo/do-again课程&amp;&amp;识别完全相同的错误

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

  • 您更改了文本框的文本
  • 文本框会触发exe命令:<------------------------------+
    • 您的列表会使用命令项|
    • 获取新项目
    • 命令项包含实际文本|
  • 现在点击undo按钮:|
    • 您收到了文本框|
    • 的旧文字
    • 您将旧文本分配到文本框|
    • 将旧文本分配到文本框,文本显然会更改|
    • 文本框发送新的exe命令------------------------+
    • 现在你再次看到列表中的相同项目

这就是为什么你必须双击你认为文本改变的undo按钮...

实际上文字已更改,但由于它保持不变,您通过任何 UI更新识别它。

你看到漂亮的ASCII箭头? ^^