在WPF中,我有一个符合MVVM设计模式的应用程序。此应用程序中的大部分工作都是在模型中完成的,如下所示:
CalculatorModel calculator = new CalculatorModel();
calculator.Execute();
为了实现进度条,我需要在后台工作线程的DoWork
方法中调用它,然后在必要时调用ReportProgress
。
Execute()
方法如下所示:
for(int x=0; x < 1000; x++){
// perform function
}
如何从CalculatorModel调用ReportProgress?
答案 0 :(得分:3)
您的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>
是一个通用界面,因此您可以使用int
代替string
。以{{1}}格式说&#34;刚开始...&#34;,&#34;工作的一半完成......&#34;等等。
答案 1 :(得分:1)
只需在viewmodel(model)类中创建属性:
public Int32 WorkTotal {get {...} private set{...}}
和
public Int32 WorkDone {get {...} private set {...}}
在开始作业之前设置WorkTotal
,然后在您的worker方法中更改WorkDone
值。不需要线程同步 - WPF使用正确的调度代码处理绑定。
您的viewmodel(或模型)类应该implement INotifyPropertyChanged和这些属性 应该使用PropertyChanged事件通知侦听器。你也是
然后,您只需将ProgressBar属性绑定到viewmodel中的属性:
<ProgressBar Minimum="0" Maximum="{Binding WorkTotal, Mode=OneWay}" Value="{Binding WorkDone , Mode=OneWay}">