Я пытаюсь выполнить простое действие по обновлению индикатора выполнения на моем пользовательском интерфейсе внутри цикла с помощью 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
- все они обновляются после цикла.
Я думаю, я не понимаю. Я хочу быть в цикле и после выполнения какой-то логики, я хочу обновить интерфейс. Должен ли я выполнять логику в событии DoWork? –
@TraeMoore да, вы должны поместить его в 'DoWork', иначе он будет выполняться синхронно, и пользовательский интерфейс не будет обновляться до конца метода. – McGarnagle
Мне жаль, я должен сводить тебя с ума. :) Я выполняю это из ICommand, поэтому у меня нет доступа к приложению. Моя ViewModel полностью отделена от моего представления. и FileList привязан к «DataGrid», поэтому я не могу нажать «ToArray()». –