如何在不丢失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