2013-12-16 3 views
1

Я пытаюсь выполнить простое действие по обновлению индикатора выполнения на моем пользовательском интерфейсе внутри цикла с помощью BackgroundWorker. Я не знаю, что я делаю неправильно. Любая помощь приветствуется.Обновить пользовательский интерфейс из ViewModel

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

Коллекция является ObservableCollection и ProgressBarValue связан со значением индикатора выполнения.

Я рассмотрел несколько примеров и независимо от того, какой из них я попробовал - BackgroundWorker, Dispatcher - все они обновляются после цикла.

ответ

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 связанных обновлений обратно в поток пользовательского интерфейса (в противном случае вы получите исключение доступа к перекрестному потоку).

+0

Я думаю, я не понимаю. Я хочу быть в цикле и после выполнения какой-то логики, я хочу обновить интерфейс. Должен ли я выполнять логику в событии DoWork? –

+0

@TraeMoore да, вы должны поместить его в 'DoWork', иначе он будет выполняться синхронно, и пользовательский интерфейс не будет обновляться до конца метода. – McGarnagle

+0

Мне жаль, я должен сводить тебя с ума. :) Я выполняю это из ICommand, поэтому у меня нет доступа к приложению. Моя ViewModel полностью отделена от моего представления. и FileList привязан к «DataGrid», поэтому я не могу нажать «ToArray()». –

Смежные вопросы