【问题标题】:force TextBox to refresh强制 TextBox 刷新
【发布时间】:2013-08-26 14:41:21
【问题描述】:

我有一个普通的 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" />

【问题讨论】:

  • 你的 XAML 是什么样的?
  • 为什么将文本绑定到属性时设置statusTextBox.Text = "newValue"
  • TextPropertyUpdateSourceTrigger=PropertyChanged 上引发OnPropertyChanged 事件就足够了。您尝试过这些方法吗?
  • @Bob 这只是我多次尝试改变显示值的尝试之一。其实我用的是绑定。

标签: c# wpf textbox


【解决方案1】:

如果你的方法做了很多工作,它可能会持有 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 元素。

【讨论】:

  • 我确实在文本框绑定到的属性中使用了 RaisePropertyChanged。
  • 太好了!然后,您所要做的就是将占用您方法执行链的内容包装在任务中,并更新您的 statusTextBox 绑定到那里的属性。它将立即更新 - 在方法完成执行之前。
  • 我在这里找到了另一个好的解决方案:dedjo.blogspot.dk/2007/08/how-to-doevents-in-wpf.html
  • 哦,是的,这是释放 UI 线程的另一种方式。我通常只在我无法控制/做任何其他事情时使用它。例如,DataGrid 加载速度很慢,所以我会将每行加载和 DoEvents() 分开,从而为展开行提供级联效果。在这里仅使用任务似乎更简单,但这取决于您的喜好。保重。
【解决方案2】:

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

【讨论】:

  • 技术上他已经在使用TwoWay,因为它是TextBox的默认值。但是是的,真正的答案是INotifyPropertyChanged
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2018-03-29
    相关资源
    最近更新 更多