![](/img/trans.png)
[英]Implementing Progress bar using WPF with MVVM pattern (without BackgroundWorker)
[英]Implementing a progress bar with MVVM / WPF
在WPF中,我有一个符合MVVM设计模式的应用程序。 此应用程序中的大部分工作是在一个模型中完成的,该模型如下所示:
CalculatorModel calculator = new CalculatorModel();
calculator.Execute();
为了实现进度条,我需要在后台工作线程的DoWork
方法中调用它,然后在必要时调用ReportProgress
。
Execute()
方法如下所示:
for(int x=0; x < 1000; x++){
// perform function
}
如何从CalculatorModel调用ReportProgress?
您的Execute()
方法可以具有IProgress<T>
类型的附加参数。 该接口公开Report(T value)
。
internal void Execute(IProgress<int> progress)
{
for(int x=0; x < 1000; x++){
progress.Report(x);
// perform function
}
}
在客户端,如果您想通知用户任何进度,可以订阅ProgressChanged
事件。 或者,您可以将委托传递给Progress类的构造函数:
// Create the progress object.
Progress<int> progress = new Progress<int>((result) =>
{
this.MyMethodToDisplayProgressToUser(result);
});
// Pass it to your method.
Execute(progress);
请注意, IProgress<T>
是通用接口,因此您可以使用string
格式而不是int
来生成报告,例如说“刚开始...”,“工作完成了一半...”的string
格式,等等。
只需在viewmodel(model)类内创建属性:
public Int32 WorkTotal {get {...} private set{...}}
和
public Int32 WorkDone {get {...} private set {...}}
在开始作业之前,设置WorkTotal
,然后在worker方法内部只需更改WorkDone
值。 不需要线程同步-WPF使用正确的调度代码处理绑定。
您的viewmodel(或模型)类应实现 INotifyPropertyChanged,并且这些属性应使用PropertyChanged事件通知侦听器。 还有你
然后,您只需将ProgressBar属性绑定到视图模型中的属性即可:
<ProgressBar Minimum="0" Maximum="{Binding WorkTotal, Mode=OneWay}" Value="{Binding WorkDone , Mode=OneWay}">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.