私は同様の場合に以下のアプローチをとった。このビューには、時間がかかるアクションがあり、定期的に進捗状況を表示したいと考えています。長時間実行されているアクションは、別のクラスのWorkerにプッシュダウンされます。いくつかのユーザアクションがTestViewModelのDoSomething
への呼び出しを開始します。
TestView.xaml
...
<!-- Progress bar -->
<ProgressBar Visibility="Visible" Height="10" Value="{Binding SomeValue}"/>
...
TestViewModel。CSはBaseViewModel、BaseViewModelだけINotifyPropertyChangedの
...
private void DoSomething(){
Worker worker = new Worker();
worker.ProgressChanged += new EventHandler<WorkerEventArgs>(OnProgressChanged);
worker.Start();
}
private void OnProgressChanged(object sender, WorkerEventArgs args){
SomeValue = args.Progress;
}
private const String SomeValuePropertyName = "SomeValue";
private double someValue;
public double SomeValue
{
get
{
return someValue;
}
set
{
if (someValue == value)
{
return;
}
someValue = value;
NotifyPropertyChanged(SomeValuePropertyName);
}
}
...
Worker.csに
...
public event EventHandler<WorkerEventArgs> ProgressChanged;
public void Start(){
//This will take a long time. Periodically call NotifyProgress
}
private void NotifyProgress()
{
if (ProgressChanged != null)
{
double progress = ...; //calculate progress
ProgressChanged(this, new WorkerEventArgs(progress));
}
}
...
WorkerEventArgs.cs
public class WorkerEventArgs : EventArgs
{
public double Progress { get; private set; }
public WorkerEventArgs(double progress)
{
Progress = progress;
}
}
非常に完全な答えをありがとう。イベントの見方は、ビジネスレイヤーにはない非常に技術的な問題でした。しかし結局、プロセスがどのように進行しているかに関する情報を送信する方法がなければなりません。 – Gimly
@Gimly:どうぞよろしくお願いいたします。私はイベントが "アクティブな"オブジェクトを実装するビジネス層で便利だと思います。あなたの質問のシナリオは良い例です。 – CesarGon