WPF MVVM更新标签文本

时间:2011-03-17 03:37:20

标签: wpf multithreading mvvm dispatcher

我的标签文本在我的3.5 WPF MVVM应用程序中没有正确更新。 do work部分持续时间足够长,你可以看到等待的鼠标指针。 我所看到的只是标签中的“Parsed”,它是绑定到InfoText。 Dispatcher和work工作线都在Command的方法中。 想法?

代码

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 个答案:

答案 0 :(得分:2)

我唯一能想到解释的是你在UI线程上做的工作。这将阻止调度程序重新绘制,直到您的工作完成。在Invoke中传递的工作被放置在事件队列中,这意味着它将在空闲时执行。

解决问题的正确方法是在单独的线程上完成工作。如果您正在寻找变通方法,look here。 参考:MSDN

编辑: 有很多方法可以在另一个线程上执行工作。阅读BackgroundWorker,ThreadPool,任务Parallell库,线程。 :) 这是在后台线程中完成工作的一种非常简单的方法:

     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");
     });

答案 1 :(得分:0)

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

这适合我。

然而,我会把我长期运作的过程放在后台工作中。所以ui线程不会被阻止。

编辑:如果你在ui线程中完成所有工作,你应该查看BeginInvoke的重载 - 你可以传递一个DispatcherPriority。可能这也有帮助