0

AppBar に「すべて同期」するためのボタンがあります。これにより、各プロバイダーの Web サービスが呼び出され、キャッシュされているデータが更新されます。更新したら、画面上で選択したプロバイダー データを更新する必要があるため、mvvm-light でこれを行うにはどうすればよいですか。

1)ボタンをクリックしてもデータにアクセスしようとすると、現在ロードされているビューモデルにアクセスする方法がわからないため、それらの背後にあるデータを更新できます。クリック イベントからビュー モデルにアクセスし、基になるデータを更新する方法はありますか。

2)それがメッセンジャークラスの使用目的であり、ユーザーが「すべて同期」ボタンをクリックしたときにこの機能を使用するために見ることができる良い例があるかどうか疑問に思っています。

3)メッセンジャークラスがこれを行う方法ではなく、現在のビューモデルにアクセスする方法がない場合、他にどのようなオプションがありますか.

どんな助けでも大歓迎です。

4

1 に答える 1

1

これを行うには2つの方法があります。

  1. メッセンジャーを使用する
  2. 標準イベントの使用

オプション1は、デザインに関係なくほとんど機能し、次のようになります。

  1. ユーザーがAppBarボタンをクリックすると、コマンドが呼び出されます
  2. コマンドは、内部でWebサービスを呼び出すサービスを呼び出すか(良い方法)、またはコマンドはWebサービスを呼び出すだけです(それほど良い方法ではありません)。このメソッドは非同期メソッドになると思います。
  3. 新しいデータを取得したら、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と同様に機能します。このサービスは、すべてのビューモデルに注入されます。

  1. ユーザーがAppBarボタンをクリックすると、コマンドが呼び出されます
  2. コマンドは、内部でWebサービスを呼び出すサービスを呼び出すか(良い方法)、またはコマンドはWebサービスを呼び出すだけです(それほど良い方法ではありません)。このメソッドは非同期メソッドになると思います。
  3. このサービスは、サブスクライブされたビューモデルにデータを更新する必要があることを通知するための標準イベントを発生させます。したがって、基本的にオプション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を使用してください。

于 2013-03-04T12:13:50.747 に答える