9

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

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

文本框是这样声明的

<TextBox Text="{Binding ShortCutText, Mode=TwoWay}"/>

在事件处理程序中,我尝试同时使用

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

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

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

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

4

8 回答 8

10
var box = sender as TextBox;
// Change your box text..

box.GetBindingExpression(TextBox.TextProperty).UpdateSource();

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

于 2012-09-05T12:01:57.853 回答
3

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

于 2012-09-05T12:05:06.010 回答
2

如果您的绑定因设置新值而被破坏(这很奇怪,对于双向绑定,绑定应该保持不变),然后使用 ((TextBox)sender).SetCurrentValue(TextBox.TextProperty, newValue) 保持绑定不变。

于 2020-02-27T13:39:08.880 回答
1

这成功了:

private static void SetText(TextBox textBox, string text)
    {
        textBox.Clear();
        textBox.AppendText(text);
        textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
于 2012-09-05T12:06:38.360 回答
1

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

<TextBox Text="{Binding Path=ShortCutText,Mode=OneWay}" 
         KeyDown="TextBox_KeyDown" IsReadOnly="True"/>

您应该在您的类中实现INotifyPropertyChanged接口,如 MSDN 中所述:

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( );
}
于 2012-09-05T18:50:23.220 回答
1

我有类似的情况。

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

我穿:textbox1.Text = String.empty

我为此改变:textbox1.Clear()

这是我的解决方案的重点

于 2015-05-24T23:02:25.490 回答
0

如果您使用 MVVM,则不应从 code 更改 TextBox 的 Text 属性,更改视图模型中的值,模式将完成同步视图的工作。

于 2015-05-25T10:06:07.540 回答
0

您可以在 xaml 本身中配置它:

<TextBox Text="{Binding ShortCutText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

UpdateSourceTrigger=PropertyChanged

于 2018-08-15T14:23:55.967 回答