C# 强制文本框刷新

C# 强制文本框刷新,c#,wpf,textbox,C#,Wpf,Textbox,我有一个绑定到字符串属性的普通wpf TextBox控件。我需要在绑定或.text属性更新后立即更新显示的文本。我试过了 ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource(); ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateTarget(); 在TextChanged事件处理程序中 我在绑定上尝试了Update

我有一个绑定到字符串属性的普通wpf TextBox控件。我需要在绑定或.text属性更新后立即更新显示的文本。我试过了

((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();
((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
在TextChanged事件处理程序中

我在绑定上尝试了
UpdateSourceTrigger=Explicit
。我试过了

Application.Current.Dispatcher.BeginInvoke(
    DispatcherPriority.Input,
     new Action(() =>
     {
         statusTextBox.Text = "newValue";
     }));
还有许多不同的组合。但显示的文本仅在我从退出更新文本框的方法一次后才会更改

XAML:


如果您的方法正在执行大量工作,那么它可能会保持UI线程()的执行顺序)。无论您在该方法中执行什么操作,请在后台线程中执行

private void SomeMethod()
{
   Task.Factory.StartNew(() =>
        {
                       /// do all your logic here

                       //Update Text on the UI thread 
                       Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Input,
                      new Action(() => { statusTextBox.Text = "newValue";}));

                       //continue with the rest of the logic that take a long time
                    });

只要确保在该方法中,如果您正在触摸任何UI元素,那么您可以在UI线程上进行操作,否则将导致崩溃。让UI线程知道的另一个可能更好的方法是提高希望绑定知道的属性更改,而不是直接操作UI元素。

您需要使用双向绑定,而不是直接更改文本框的值,并且需要在绑定数据的类上实现INotifyPropertyChanged。

尝试以下代码序列,它对我有效-

Textblock1.Text = "ABC";
System.Windows.Forms.Application.DoEvents();
MainWindow.InvalidateVisual();
System.Threading.Thread.Sleep(40);

XAML是什么样子的?为什么将文本绑定到属性时要设置
statusTextBox.Text=“newValue”
?在
TextProperty
UpdateSourceTrigger=PropertyChanged
上引发
OnPropertyChanged
事件就足够了。你尝试过这些方法吗?@Bob这只是我多次尝试改变显示值的方法之一。实际上我使用了绑定。我在我的属性中使用了RaisePropertyChanged,文本框被绑定到了。这太棒了!然后,您所要做的就是在任务中包装占用方法执行链的内容,并更新statusTextBox绑定到其中的属性。它将立即更新-在方法执行之前。我在这里找到了另一个好的解决方案:哦,是的,这是另一种释放UI线程的方法。我通常只在我无法控制/做任何其他事情时才使用它。例如,DataGrid加载速度较慢,因此我会将每一行的加载和DoEvents()分隔开来,从而使其具有层叠效果,可以展开行。在这里,仅仅使用任务似乎更简单,但这取决于您的偏好。小心。从技术上讲,他已经在使用双向
了,因为这是
文本框的默认设置。但真正的答案是
INotifyPropertyChanged
Textblock1.Text = "ABC";
System.Windows.Forms.Application.DoEvents();
MainWindow.InvalidateVisual();
System.Threading.Thread.Sleep(40);