web-dev-qa-db-ja.com

MVVMパターンを使用してプログレスバーを実装する方法

MVVM設計パターンに基づいて構築されたWPFアプリケーションがあります。

アプリにプログレスバーを実装し、MVVMパターンに従います。

これを実装する方法についての提案はありますか?

前もって感謝します

33
jpgooner

通常、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;
    }
}
56
Kent Boogaart

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");
    }
}
10
Thomas Levesque

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}}"/> 
6
HCL