본문 바로가기

.NET/MVVM Light

[MVVM-Light]Implementing Progress bar using WPF with MVVM pattern(using BackgroundWorker)

ProgressbarSampleView.xaml 

<UserControl x:Class="MyProject.ProgressbarSampleView" 
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
               Height="718" Width="1024"> 
 
  <ProgressBar Grid.Row="1"  
                 Value="{Binding CurrentProgress, Mode=OneWay}"  
                 Visibility="{Binding ProgressVisibility}"  
                 Margin="22,0,25,0" /> 
 
  <Button   Grid.Row="2" 
            Content="Start Now"   
            Height="30"  
            Width="80"  
            HorizontalAlignment="Left"  
            Margin="22,4,0,0"  
            Name="btnStartNow"  
            VerticalAlignment="Top"  
            Command="{Binding Path=InstigateWorkCommand}"  
            /> 
  </UserControl> 

 

ProgressarSampleViewModel.cs

namespace MyProject 
  { 
   public class ProggressbarSampleViewModel: ViewModelBase 
   { 
     private readonly BackgroundWorker worker;  
     private readonly ICommand instigateWorkCommand; 
 
     public ProggressbarSampleViewModel() 
     { 
        this.instigateWorkCommand = new  
                      RelayCommand(o => this.worker.RunWorkerAsync(), o => !this.worker.IsBusy); 
        this.worker = new BackgroundWorker(); 
        this.worker.DoWork += this.DoWork; 
        this.worker.ProgressChanged += this.ProgressChanged; 
    } 
 
 
    public ICommand InstigateWorkCommand 
    { 
        get { return this.instigateWorkCommand; } 
    } 
 
    private int _currentProgress; 
    public int CurrentProgress 
    { 
        get { return this._currentProgress; } 
        private set 
        { 
            if (this._currentProgress != value) 
            { 
                this._currentProgress = value; 
                OnPropertyChanged("CurrentProgress");  
            } 
        } 
     } 
 
     private void ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
        this.CurrentProgress = e.ProgressPercentage; 
     } 
 
    private void DoWork(object sender, DoWorkEventArgs e) 
    { 
        // do time-consuming work here, calling ReportProgress as and when you can    
        for (int i = 0; i < 100; i++) 
        { 
            Thread.Sleep(1000); 
            _currentProgress = i; 
            OnPropertyChanged("CurrentProgress"); 
        } 
    } 
 
  } 

 

*버튼을 실행하는 command를 만들고, 그 내부에서 RunWorkerAsync 함수를 호출하는게 나을 듯 하다.

 

'.NET > MVVM Light' 카테고리의 다른 글

[MVVM-Light] View와 View 사이 통신  (0) 2013.07.10
[MVVM-Light]ViewModel 간 values 전달  (0) 2013.07.10