In this simple example, we will see how to create and manipulate the ProgressBar control from WPF in a MVVM way.
Let’s start with the View in XAML:
<Window x:Class="ProgressBar_Demo.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
</Window.Resources>
<Grid>
<StackPanel Orientation="Vertical">
<Button
Margin="30"
Width="70"
Command="{Binding StartWorkCommand}"
Content="Start" />
<!--PROGRESS BAR WITH TEXT-->
<Grid
Margin="20"
Visibility="{Binding ProgressVisibility, Converter={StaticResource booleanToVisibilityConverter}}">
<ProgressBar
Margin="20"
Height="20" Width="150"
Value="{Binding CurrentProgress, Mode=OneWay}" />
<TextBlock
Text="{Binding CurrentProgress, StringFormat={}{0:0}%}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</StackPanel>
</Grid>
</Window>
Code language: HTML, XML (xml)
And now the ViewModel:
using Prism.Commands;
using Prism.Mvvm;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
namespace ProgressBar_Demo.ViewModels
{
public class MainWindowViewModel : BindableBase
{
#region Properties
private string _title = "ProgresBar Demo";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private readonly BackgroundWorker _worker;
private ICommand _startWorkCommand;
public ICommand StartWorkCommand
{
get { return _startWorkCommand
?? (_startWorkCommand = new DelegateCommand(() => _worker.RunWorkerAsync(), () => !_worker.IsBusy)); }
}
private int _currentProgress;
public int CurrentProgress
{
get { return _currentProgress; }
private set { SetProperty(ref _currentProgress, value); }
}
private bool _progressVisibility;
public bool ProgressVisibility
{
get { return _progressVisibility; }
set { SetProperty(ref _progressVisibility, value); }
}
#endregion
public MainWindowViewModel()
{
_worker = new BackgroundWorker();
_worker.DoWork += DoWork;
_worker.WorkerReportsProgress = true;
_worker.ProgressChanged += ProgressChanged;
ProgressVisibility = false;
}
private void DoWork(object sender, DoWorkEventArgs e)
{
ProgressVisibility = true;
for (int i = 0; i <= 100; i++)
{
//Simulate a long running task
Thread.Sleep(50);
//Reports the progress
(sender as BackgroundWorker).ReportProgress(i);
}
ProgressVisibility = false;
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
CurrentProgress = e.ProgressPercentage;
if (CurrentProgress == 100)
ProgressVisibility = false;
}
}
}
Code language: C# (cs)
Happy coding! 🙂