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

时间:2012-09-05 11:58:23

标签: c# wpf mvvm

在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? 或者我的流程中的其他地方是否有错误?

8 个答案:

答案 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)离开绑定完好。