强制TextBox刷新

时间:2013-08-26 14:41:22

标签: c# wpf textbox

我有一个绑定到字符串属性的普通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:

<TextBox x:Name="txBox" Height="150" Margin="0,0,0,0" VerticalAlignment="Top" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" AcceptsReturn="True"  VerticalContentAlignment="Top" Text="{Binding TextProperty}"Width="200" />

3 个答案:

答案 0 :(得分:4)

你的方法,如果它做了很多工作,可能是持有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线程知道的另一种可能更好的方法是让你想让绑定知道的RaisePropertyChanged,而不是直接操作UI元素。

答案 1 :(得分:0)

您需要使用TwoWay绑定而不是明确更改TextBox的值,并且需要在绑定数据类上实现 INotifyPropertyChanged

答案 2 :(得分:0)

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

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