使用MVVM / WPF实现进度条

时间:2014-06-30 12:29:30

标签: c# wpf progress-bar backgroundworker

在WPF中,我有一个符合MVVM设计模式的应用程序。此应用程序中的大部分工作都是在模型中完成的,如下所示:

CalculatorModel calculator = new CalculatorModel();
calculator.Execute();

为了实现进度条,我需要在后台工作线程的DoWork方法中调用它,然后在必要时调用ReportProgress

Execute()方法如下所示:

for(int x=0; x < 1000; x++){
   // perform function
}

如何从CalculatorModel调用ReportProgress?

2 个答案:

答案 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}">