在WPF应用程序中,我正在创建一个设置窗口来自定义键盘快捷键。
在文本框中,我处理KeyDown事件并将Key事件转换为人类可读的形式(以及我想要获取数据的形式)。
文本框声明如下
<TextBox Text="{Binding ShortCutText, Mode=TwoWay}"/>
在事件处理程序中,我尝试使用两者
(sender as TextBox).Text = "...";
和
(sender as TextBox).Clear();
(sender as TextBox).AppendText("...");
在这两种情况下,绑定回viewmodel都不起作用,viewmodel仍然包含旧数据并且不会更新。 在另一个方向(从视图模式到文本框)绑定工作正常。
有没有办法可以在不使用绑定的情况下从代码编辑TextBox.Text? 或者我的流程中的其他地方是否有错误?
答案 0 :(得分:9)
var box = sender as TextBox;
// Change your box text..
box.GetBindingExpression(TextBox.TextProperty).UpdateSource();
这会强制您的绑定更新。
答案 1 :(得分:3)
不要更改Text属性 - 更改绑定的内容。
答案 2 :(得分:1)
这就是诀窍:
private static void SetText(TextBox textBox, string text)
{
textBox.Clear();
textBox.AppendText(text);
textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
答案 3 :(得分:1)
根本不需要修改TextBox的值!在代码中,您只需要修改相关值( ShortCutText )。您还可以设置TextBox的 IsReadOnly =“ True ”属性。
<TextBox Text="{Binding Path=ShortCutText,Mode=OneWay}"
KeyDown="TextBox_KeyDown" IsReadOnly="True"/>
您应该在MSDN中描述的类中实现 INotifyPropertyChanged 接口:
http://msdn.microsoft.com/library/system.componentmodel.inotifypropertychanged.aspx
修改 ShortCutText 属性的设置者( 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( );
}
答案 4 :(得分:1)
我有类似的情况。
当我清除文本框时,这会丢失Binding。
我穿了:textbox1.Text = String.empty
我改变了这个:textbox1.Clear()
这是我的解决方案的重点
答案 5 :(得分:0)
如果您正在使用MVVM,则不应从代码更改TextBox的Text属性,更改视图模型中的值,并且该模式将执行其同步视图的工作。
答案 6 :(得分:0)
您可以在xaml本身中对其进行配置:
<TextBox Text="{Binding ShortCutText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
UpdateSourceTrigger =属性更改
答案 7 :(得分:0)
如果通过设置新值破坏了绑定(这很奇怪,对于绑定的两种方式绑定应保持不变),则使用((TextBox)sender).SetCurrentValue(TextBox.TextProperty,newValue)离开绑定完好。