MVVM設計パターンに基づいて構築されたWPFアプリケーションがあります。
アプリにプログレスバーを実装し、MVVMパターンに従います。
これを実装する方法についての提案はありますか?
前もって感謝します
通常、UIはVMのプロパティに単純にバインドします。
<ProgressBar Value="{Binding CurrentProgress, Mode=OneWay}"
Visibility="{Binding ProgressVisibility}"/>
あなたのVMは BackgroundWorker
を使用してバックグラウンドスレッドで作業を行い、定期的にCurrentProgress
値を更新します。このような:
public class MyViewModel : ViewModel
{
private readonly BackgroundWorker worker;
private readonly ICommand instigateWorkCommand;
private int currentProgress;
public MyViewModel()
{
this.instigateWorkCommand =
new DelegateCommand(o => this.worker.RunWorkerAsync(),
o => !this.worker.IsBusy);
this.worker = new BackgroundWorker();
this.worker.DoWork += this.DoWork;
this.worker.ProgressChanged += this.ProgressChanged;
}
// your UI binds to this command in order to kick off the work
public ICommand InstigateWorkCommand
{
get { return this.instigateWorkCommand; }
}
public int CurrentProgress
{
get { return this.currentProgress; }
private set
{
if (this.currentProgress != value)
{
this.currentProgress = value;
this.OnPropertyChanged(() => this.CurrentProgress);
}
}
}
private void DoWork(object sender, DoWorkEventArgs e)
{
// do time-consuming work here, calling ReportProgress as and when you can
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.CurrentProgress = e.ProgressPercentage;
}
}
ProgressBar
コントロールを使用し、そのValue
プロパティをViewModelのプロパティにバインドします。
表示
<ProgressBar Minimum="0" Maximum="0" Value="{Binding CurrentProgress}" />
ViewModel
private double _currentProgress;
public double CurrentProgress
{
get { return _currentProgress; }
private set
{
_currentProgress = value;
OnPropertyChanged("CurrentProgress");
}
}
VMに2つのプロパティを追加します。
bool IsProgressBarVisible
double ProgressValue
VMで長時間の操作を開始する場合は、IsProgressBarVisible-propertyをtrueに設定し、ProgressValue周期を現在の進行値に設定します。 0〜100の値を計算してみてください。これには、最小値と最大値を指定する必要がないという利点があります。非同期操作が完了したら、IsProgressBarVisibleをfalseに設定します。
XAMLで、これら2つのプロパティにバインドします。値コンバーターを使用して、ブールの可視性を可視性に変換します。
<ProgressBar Value="{Binding ProgressValue}" Visibility="{Binding IsProgressBarVisible,Converter={StaticResource BooleanToVisibility_ValueConverter}}"/>