У меня есть прогресс бар, как это:Как сделать индикатор выполнения работы в MVVM?
<ProgressBar x:Name="import_bar" Minimum="0" Maximum="100" Orientation="Horizontal" Value="{Binding CurrentProgress, Mode=OneWay}" />
и ViewModel:
public class ViewImportProgressViewModel : BindableBase
{
MainTest mainTest;
public double CurrentProgress { get; set; }
public ViewImportProgressViewModel(MainTest mainTest) //constructor
{
this.mainTest = mainTest;
mainTest.ProgressUpdated += SetProgressBarValue;
}
private void SetProgressBarValue(double argument)
{
CurrentProgress = argument * 100;
OnPropertyChanged(() => CurrentProgress);
}
}
и тестовый класс, который фактически устанавливает значение для прогресса:
public class MainTest
{
public delegate void ProgressUpdateHandler(double argument);
public event ProgressUpdateHandler ProgressUpdated;
public void RunTheLoop()
{
double progress=0;
for (int i = 1; i <= 30; i++)
{
//lenghty task code
.......
//increment the progress bar
progress += 1/30;
if (i == 30)
progress = 1;
ProgressUpdated(progress);
}
}
}
код работает ОК, и я вижу, что CurrentProgress
получает правильное значение, но индикатор выполнения в пользовательском интерфейсе не обновляется. Может кто-нибудь, пожалуйста, помогите мне с этим?
Обновление;
Если я использовать не MVVM подход в код, как это:
public delegate void UpdateProgressBarDelegate(System.Windows.DependencyProperty dp, Object value);
UpdateProgressBarDelegate updatePbDelegate = new UpdateProgressBarDelegate(progress_bar.SetValue);
Dispatcher.Invoke(updatePbDelegate, System.Windows.Threading.DispatcherPriority.Background, new object[] { System.Windows.Controls.ProgressBar.ValueProperty, CurrentProgress });
затем он работает.
Что делает 'ProgressUpdated'? – Bijington
Он отправляет «прогресс» в ViewModel, поэтому каждый раз, когда «прогресс» обновляется, «SetProgressBarValue()» вызывается в ViewModel и передает это значение в свойство «CurrentProgress» – Ivan
Использует ли ваш класс 'ViewImportProgressViewModel'' INotifyPropertyChanged' ? – Bijington