【问题标题】:WPF MVVM update label textWPF MVVM 更新标签文本
【发布时间】:2011-03-17 14:45:13
【问题描述】:

我的标签文本没有在我的 3.5 WPF MVVM 应用程序中正确更新。 do work 部分持续的时间足够长,您可以看到等待的鼠标指针。 我所看到的只是标签中的“已解析”,它绑定到 InfoText。 Dispatcher 和 do 工作行在 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");
        }
    }

【问题讨论】:

    标签: wpf multithreading mvvm dispatcher


    【解决方案1】:

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

    修复它的正确方法是在单独的线程上进行工作。如果您正在寻找解决方法,look here。 参考:MSDN

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

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

    【讨论】:

    • 正要自己发帖
    • 我将如何在另一个线程上执行此操作?简单到 new thread();?
    • 它可以工作,但现在我遇到了“这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection”的问题
    • 改变你的集合的代码行现在必须在 Application.Current.Dispatcher.BeginInvoke(new Action(() => { //这里是你的代码行改变你的集合} ;));,因为集合被分配给 ui 线程。但请注意,您不要在其中使用长时间运行的东西,否则 ui 会再次挂起;)也许您应该发布您的 dowork 代码以提供更好的信息
    【解决方案2】:
     Application.Current.Dispatcher.BeginInvoke(new Action(() => this.InfoText="Start Parsing"));
    

    这对我有用。

    尽管如此,我还是会将我长期运行的进程放在后台工作程序中。所以ui线程不会被阻塞。

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

    【讨论】:

      猜你喜欢
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多