2013-08-26 175 views
4

我有一個正常的WPF文本框控件綁定到一個字符串屬性。我需要在綁定或.Text屬性更新後立即更新顯示的文本。我試過強制TextBox刷新

在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" /> 
+0

什麼是您的XAML樣子? – Shoe

+0

@Jim添加了XAML – user1151923

+0

當您將文本綁定到屬性時,爲什麼要設置'statusTextBox.Text =「newValue」'? –

回答

3

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

+0

我在文本框綁定的屬性中使用了RaisePropertyChanged。 – user1151923

+0

太棒了!然後,你所要做的就是將你的方法的執行鏈放在任務中,並更新你的statusTextBox綁定到的屬性。它會立即更新 - 在方法完成其執行之前。 –

+0

我在這裏發現了另一個很好的解決方案:http://dedjo.blogspot.dk/2007/08/how-to-doevents-in-wpf.html – user1151923

0

您需要使用雙向綁定,而不是更改文本框的值,並且需要在綁定數據的類上實現INotifyPropertyChanged

+1

技術上他已經使用'TwoWay',因爲它是TextBox的默認值。但是,_real_答案是'INotifyPropertyChanged' – Shoe

0

試試下面的代碼序列,它的工作我 -

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