如何撤消由绑定引起的TextBox文本更改?

H.B*_*.B. 4 wpf binding textbox wpf-controls

我有一个TextBox我绑定一个字符串,如果我现在手动编辑文本我将能够通过撤消这些更改TextBox.Undo(),如果我更改字符串和TextBox的文本更新,我无法撤消这些更改,该TextBox.CanUndo属性将始终是false.
我想这可能与完全替换文本而不是修改它有关.

关于如何让这个工作的任何想法?

Ken*_*son 7

好的,开始发表评论并意识到这是一个答案:)

TextBox.Undo()旨在撤消用户与文本框的交互,而不是对其绑定的属性进行值更改.文本框绑定的属性更改只会更新TextBox的值,这与用户通过焦点/键盘编辑的更改不同.如果需要撤消对绑定属性的更改,则可能需要调查向应用程序添加撤消/重做堆栈.


dot*_*NET 7

我面临同样的问题(需要接受输入Enter并恢复到原始值Escape)并且能够以这种方式处理它:

  1. UpdateSourceTriggerTextBox.Text绑定的集合Explicit.
  2. 处理KeyDownTextBox的事件并将以下代码放在其中:

    if (e.Key == Key.Enter || e.Key == Key.Escape)
    {
      BindingExpression be = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
    
      if (e.Key == Key.Enter)
      {
        if (be != null) be.UpdateSource();
      }
      else if (e.Key == Key.Escape)
      {
        if (be != null) be.UpdateTarget(); //cancels newly supplied value and reverts to the original value
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我发现这个解决方案非常优雅,因为它也可以在DataTemplates中使用.例如,在我的情况下,我使用它来允许ListBox项目的就地编辑.


小智 5

直接分配给TextBox:

textBox.SelectAll();
textBox.SelectedText = newText;
Run Code Online (Sandbox Code Playgroud)