これを行うには2つの方法があります。
- メッセンジャーを使用する
- 標準イベントの使用
オプション1は、デザインに関係なくほとんど機能し、次のようになります。
- ユーザーがAppBarボタンをクリックすると、コマンドが呼び出されます
- コマンドは、内部でWebサービスを呼び出すサービスを呼び出すか(良い方法)、またはコマンドはWebサービスを呼び出すだけです(それほど良い方法ではありません)。このメソッドは非同期メソッドになると思います。
- 新しいデータを取得したら、Messenger.Default.Send()を呼び出して、データを更新する必要があるすべてのリスニングビューモデルにブロードキャストします。
コード:
ViewModel:
public class ViewModel
{
public ViewModel()
{
Messenger.Default.Register<DataRefreshEvent>(this,ReceiveDataRefreshEvent);
}
private void ReceiveDataRefreshEvent(DataRefreshEvent obj)
{
//do what you need to do
}
}
サービス:
public class Service
{
public async void RefreshData()
{
await _webService.RefreshDataAsync();
Messenger.Default.Send(new ReceiveDataRefreshEvent());
}
}
オプション2は、Webサービスをラップする中央データサービスがあることを想定していることを除いて、オプション1と同様に機能します。このサービスは、すべてのビューモデルに注入されます。
- ユーザーがAppBarボタンをクリックすると、コマンドが呼び出されます
- コマンドは、内部でWebサービスを呼び出すサービスを呼び出すか(良い方法)、またはコマンドはWebサービスを呼び出すだけです(それほど良い方法ではありません)。このメソッドは非同期メソッドになると思います。
- このサービスは、サブスクライブされたビューモデルにデータを更新する必要があることを通知するための標準イベントを発生させます。したがって、基本的にオプション1と同じですが、各ビューモデルがメッセージングイベントではなくサービス上のイベントをサブスクライブするアクティブである点が異なります。
コード:
ViewModel:
public class ViewModel
{
public ViewModel(IService service)
{
service.DataChanged+=ReceiveDataRefreshedEvent;
}
private void ReceiveDataRefreshEvent(sender obj,EventArgs args)
{
//do what you need to do
}
}
サービス:
public class Service:IService
{
public event EventHandler ReceiveDataRefreshedEvent;
public async void RefreshData()
{
await _webService.RefreshDataAsync();
if(ReceiveDataRefreshedEvent!=null)
ReceiveDataRefreshedEvent(this,EventArgs.Empty);
}
}
オプション1は、サービスへの参照をViewModelに渡す必要がないため便利です。それはうまく分離されています。
メッセージングについて不明な点がある場合は、オプション2を使用してください。