从ViewModel更新UI线程

时间:2013-12-16 18:06:45

标签: c# wpf user-interface mvvm backgroundworker

我正在尝试使用BackgroundWorker执行在循环内更新UI上的进度条的简单操作。我不知道自己做错了什么。非常感谢任何帮助。

private void ProcessButtonClickAction(object param)
{
   BackgroundWorker BGWUpdateUi = new BackgroundWorker();

   BGWUpdateUi.ProgressChanged += (sender, args) =>
   {
       ProgressBarValue += args.ProgressPercentage;
       ((SelectedDwgFile)args.UserState).Status = "Completed";
   };

   BGWUpdateUi.WorkerReportsProgress = true;

    foreach(var obj in FileList)
    {
        Thread.Sleep(250);
        BGWUpdateUi.ReportProgress(pbvalueIncrement, obj);
    }
}

该集合是ObservableCollectionProgressBarValue绑定到进度条的值。

我已经查看了几个示例,无论我尝试哪一个 - BackgroundWorkerDispatcher - 它们都会在循环后更新。

1 个答案:

答案 0 :(得分:3)

将要在后台运行的部分放入DoWork方法,然后调用RunWorkerAsync

private void ProcessButtonClickAction(object param)
{
   BackgroundWorker BGWUpdateUi = new BackgroundWorker()

   BGWUpdateUi.DoWork += (sender, args) =>
   {
       foreach (var obj in FileList)
       {
           Thread.Sleep(250);
           obj.Status = "Completed";
           ProgressBarValue += pbvalueIncrement;
       }
   };
   BGWUpdateUi.RunWorkerAsync();
}

此外,请确保将与UI相关的更新分发回UI线程(否则您将获得跨线程访问异常)。