使用WPF和MVVM模式实现进度条(使用BackgroundWorker) 注意:这段代码现在可以工作了。我已经修正了一些愚蠢的错误,并且正如SteveGreatrex指出的那样,我也修改了代码。

使用WPF和MVVM模式实现进度条(使用BackgroundWorker) 注意:这段代码现在可以工作了。我已经修正了一些愚蠢的错误,并且正如SteveGreatrex指出的那样,我也修改了代码。,wpf,mvvm,progress-bar,backgroundworker,Wpf,Mvvm,Progress Bar,Backgroundworker,原始发布链接 ProgressbarSampleView.xaml ProggressbarSampleViewModel.cs 名称空间MyProject { 公共类ProggersBarSampleViewModel:ViewModelBase { 私人只读后台工作人员; 专用只读ICommand和煽动工作命令; 公共程序BarSampleViewModel() { this.designeWorkCommand=新建 RelayCommand(o=>this.worker.RunWor

原始发布链接

ProgressbarSampleView.xaml

ProggressbarSampleViewModel.cs
名称空间MyProject
{
公共类ProggersBarSampleViewModel:ViewModelBase
{
私人只读后台工作人员;
专用只读ICommand和煽动工作命令;
公共程序BarSampleViewModel()
{
this.designeWorkCommand=新建
RelayCommand(o=>this.worker.RunWorkerAsync(),o=>!this.worker.IsBusy);
this.worker=新的BackgroundWorker();
this.worker.DoWork+=this.DoWork;
this.worker.ProgressChanged+=this.ProgressChanged;
}
公共ICommand煽动工作命令
{
获取{返回this.indicateWorkCommand;}
}
私人互联网的最新进展;
公共卫生进展
{
获取{返回此。\u currentProgress;}
专用设备
{
如果(此._currentProgress!=值)
{
这是。_currentProgress=值;
OnPropertyChanged(“当前进度”);
}
}
}
私有void ProgressChanged(对象发送方,progresschangedventargs e)
{
this.CurrentProgress=e.ProgressPercentage;
}
私有无效DoWork(对象发送方,DoWorkEventArgs e)
{
//在此处执行耗时的工作,尽可能调用ReportProgress
对于(int i=0;i<100;i++)
{
睡眠(1000);
_当前进度=i;
OnPropertyChanged(“当前进度”);
}
}
}

StartNow命令
从不调用
BackgroundWorker
-它只是在UI线程上同步执行
DoStartNow
方法。基于此,我猜当你点击链接到
StartNow
命令的按钮时,你会看到你的UI冻结了

您应该将按钮绑定到实际异步运行的
BackgroundWorker
命令

在这个实现中,我认为您根本不需要
StartNowCommand
。我也看不到视图模型中任何地方的
DoWork
事件处理程序,因此我假设它在编写这样的字符串之后只调用
DoStartNow

:“this.indicateWorkCommand=newrelayCommand”(o=>this.worker.RunWorkerAsync,o=>!this.worker.IsBusy);“.VS2010抛出一个错误:“委托”system.action“不接受1个参数”。您能告诉我如何克服它吗?您使用的是什么版本的.Net Framework
  <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>