如何在不丢失WPF绑定的情况下更改TextBox.Text?

在WPF应用程序中,我正在创建一个设置窗口来自定义键盘快捷方式。

在文本框中,我处理KeyDown事件并将Key事件转换为人类可读的forms(以及我想要获取数据的forms)。

文本框声明如下

 

在事件处理程序中,我尝试使用它们

 (sender as TextBox).Text = "..."; 

 (sender as TextBox).Clear(); (sender as TextBox).AppendText("..."); 

在这两种情况下,绑定回viewmodel都不起作用,viewmodel仍然包含旧数据并且不会更新。 在另一个方向(从视图模型到文本框)绑定工作正常。

有没有办法可以在不使用绑定的情况下从代码编辑TextBox.Text? 或者我的流程中的其他地方是否有错误?

 var box = sender as TextBox; // Change your box text.. box.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

这应该会强制您的绑定更新。

不要更改Text属性 – 更改绑定的内容。

这样就可以了:

 private static void SetText(TextBox textBox, string text) { textBox.Clear(); textBox.AppendText(text); textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); } 

你根本不需要修改TextBox的值! 在代码中,您只需要修改相关值( ShortCutText )您还可以设置TextBox的IsReadOnly =“ True ”属性。

  

您应该在MSDN中描述的类中实现INotifyPropertyChanged接口:

http://msdn.microsoft.com/library/system.componentmodel.inotifypropertychanged.aspx

修改ShortCutText属性的setter( TextBox绑定到的属性):

 class MyClass:INotifyPropertyChanged { string shortCutText="Alt+A"; public string ShortCutText { get { return shortCutText; } set { shortCutText=value; NotifyPropertyChanged("ShortCutText"); } } public event PropertyChangedEventHandler PropertyChanged; void NotifyPropertyChanged( string props ) { if( PropertyChanged != null ) PropertyChanged( this , new PropertyChangedEventArgs( prop ) ); } } 

WPF将自动订阅PropertyChanged事件。 现在使用TextBox的KeyDown事件,例如,如下所示:

 private void TextBox_KeyDown( object sender , KeyEventArgs e ) { ShortCutText = ( e.KeyboardDevice.IsKeyDown( Key.LeftCtrl )? "Ctrl+ " : "" ) + e.Key.ToString( ); } 

我有类似的情况。

当我清除文本框时,这会丢失Binding。

我穿了: textbox1.Text = String.empty

我改变了这个: textbox1.Clear()

这是我解决方案的重点

如果您使用MVVM,则不应从代码更改TextBox的Text属性,更改视图模型中的值,并且模式将执行其同步视图的工作。

您可以在xaml中配置它:

  

UpdateSourceTrigger =的PropertyChanged