Die wpf-Fortschrittsanzeige wird beim letzten ProgressChanged nicht aktualisiert
Ich mache einige UI und ich habe ProgressBar drin. MVVM-Muster verwenden.
XAML:
<ProgressBar Grid.Row="2" Minimum="0" Maximum="100" Value="{Binding CurrentProgress, Mode=OneWay}"/>
ViewModel (vereinfacht):
class MyClass : ViewModelBase
{
/// <summary>
/// Fields
/// </summary>
private int _currentProgress;
private readonly BackgroundWorker _worker;
private int _step;
/// <summary>
/// Properties
/// </summary>
public int CurrentProgress
{
get
{
return _currentProgress;
}
set
{
if (_currentProgress != value)
{
_currentProgress = value;
RaisePropertyChanged("CurrentProgress");
}
}
}
/// <summary>
/// Constructor
/// </summary>
public MyClass()
{
_step = 10;
_currentProgress = 0;
_worker = new BackgroundWorker();
_worker.DoWork += DoWork;
_worker.WorkerReportsProgress = true;
_worker.ProgressChanged += ProgressChanged;
_worker.RunWorkerCompleted += RunWorkerCompleted;
}
/// <summary>
/// Command
/// </summary>
private RelayCommand _myCommand;
public RelayCommand MyCommand
{
get
{
return _myCommand ?? (_myCommand =
new RelayCommand(_worker.RunWorkerAsync, CanMyCommand));
}
}
private bool CanMyCommand()
{
return true;
}
/// <summary>
/// Handlers
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
ConsumingMethod();
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Thread.Sleep(5000);
Messenger.Default.Send(new CloseAddDocumentWindow(String.Empty));
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
CurrentProgress = e.ProgressPercentage;
}
/// <summary>
/// Method
/// </summary>
private void ConsumingMethod()
{
CurrentProgress += _step;
}
}
Code-Behind:
Messenger.Default.Register<CloseAddDocumentWindow>(this, nm =>
{
if (nm.Sender == DataContext)
Close();
});
Also das
Messenger.Default.Send(new CloseAddDocumentWindow(String.Empty));
ist das Problem. Diese Zeile Fenster schließen, wie Sie sehen. Wenn ich diese Zeile kommentiere, funktioniert die Fortschrittsanzeige gut. 10, 20, 30, ... 100% verstehe ich. Ansonsten sieht der Fortschrittsbalken aus wie 10, 20, 30, ... 90%, einige warten und Fenster schließen! Ich versuche Thread.Sleep (5000) zu benutzen, um der Fortschrittsanzeige etwas Zeit zum Zeichnen zu geben. Aber auch das hilft nicht. Wie kann ich also die letzte Änderung der Persistenz sehen, wenn sich das Fenster unmittelbar danach schließt?