繁体   English   中英

使用MVVM / WPF实现进度条

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM