2011-03-17 71 views
0

我的標籤文本在我的3.5 WPF MVVM應用程序中沒有正確更新。 做工作部分持續時間足夠長,您可以看到等待的鼠標指針。 我看到的所有內容都是綁定到InfoText的標籤中的「Parsed」。 調度程序和做的工作行都在Command的方法中。 想法?WPF MVVM更新標籤文本

代碼

Dispatcher.Invoke((Action<string>)SetInfoText, "Start Parsing"); 
//do work 
Dispatcher.Invoke((Action<string>)SetInfoText, "Parsed"); 

private void SetInfoText(string text) 
    { 
     InfoText = text; 
    } 

    private string _infoText; 
    public string InfoText 
    { 
     get 
     { 
      return _infoText; 
     } 
     set 
     { 
      _infoText = value; 
      OnPropertyChanged("InfoText"); 
     } 
    } 

回答

2

我能想到的唯一的事情來解釋它是你正在做的UI線程上的工作。這可以防止調度員重新繪製,直到您的工作完成。在Invoke中傳遞的工作被放置在事件隊列中,這意味着它將在空閒時執行。

修復它的正確方法是在單獨的線程上完成工作。如果你正在尋找解決方法,look here。 編號:MSDN

編輯: 有很多方法可以在另一個線程上執行工作。閱讀BackgroundWorker,ThreadPool,任務平行庫,線程。 :) 這裏是一個非常簡單的方法做的工作在後臺線程:

 System.Threading.ThreadPool.QueueUserWorkItem(state => 
    { 
     Dispatcher.Invoke((Action<string>)SetInfoText, "Start Parsing"); 
     System.Threading.Thread.Sleep(5000); // Simulate work 
     Dispatcher.Invoke((Action<string>)SetInfoText, "Parsed"); 
    }); 
+0

即將張貼這個我自己 – AndrewS 2011-03-17 04:05:04

+0

我怎麼會在另一個線程上做到這一點?簡單的新線程();? – mike 2011-03-17 04:37:15

+0

@mike - 添加了一個示例。 – 2011-03-17 04:51:10

0
Application.Current.Dispatcher.BeginInvoke(new Action(() => this.InfoText="Start Parsing")); 

這對我的作品。

不過,我會把我長時間運行的過程放在後臺工作。所以UI線程不會被阻塞。

編輯:如果您在UI線程中完成所有工作,則應該查看BeginInvoke的重載 - 您可以傳遞DispatcherPriority。也許這也有幫助