8

サービスを必要とするコンストラクターを持つビュー モデルがあります。ビューをビューモデルに接続するためにサービスロケーターを使用するGalaSoftのMvvmLightを使用しています。

SimpleIOC は、ビューモデル コンストラクターへのサービスの提供を適切に処理しますが、ビューモデルにデータ ソースからのデータを入力する必要があります。私のビューモデルは次のようになります:-

    public class MainPageViewModel : ViewModelBase
{
    private readonly GroupService _groupService;
    private readonly GroupFactory _groupFactory;
    private readonly ObservableCollection<GroupVM> _groupVms = new ObservableCollection<GroupVM>();


    public MainPageViewModel(Domain.Services.GroupService groupService, VMFactories.GroupFactory groupFactory)
    {
        _groupService = groupService;
        _groupFactory = groupFactory;
    }

    public async Task Init()
    {
        var groups = await _groupService.LoadGroups();
        foreach (var group in groups)
        {
            GroupVms.Add(_groupFactory.Create(group));
        }
    }

    public ObservableCollection<GroupVM> GroupVms { get { return _groupVms; } }
}

どういうわけか、init メソッドを awaited と呼ぶ必要がありますが、これを行う最善の方法がわかりません。私は3つのオプションを考えることができます:-

  1. コンストラクターで Init を呼び出すだけですが、待機しません (これは本当に悪い習慣です)。
  2. ViewModelLocator オブジェクトで Init を呼び出しますが、タスクを返すことができないため、再び init を待つことができません
  3. ビューの読み込み時に、DataContext をある種の IAsyncViewmodel にキャストし、init メソッドを待ちます。

以前の Windows 8 ストア プロジェクトでオプション 3 を使用しましたが、それは間違っているように感じます。アドバイスをいただければ幸いです。

ありがとう

ロス

4

2 に答える 2

8

非同期呼び出しを待たないことを悪い習慣と考える理由に興味があります。私の意見では、それが何を意味するのかを知っている限り、呼び出しはバックグラウンドで実行され、いつでも戻る可能性があることは悪くありません。

通常、私が行うことは、設計時のデータ作成の目的でコンストラクターでasyncメソッドを呼び出すことであり、それを待ちません。バインディングを更新するために必要な場合は、PropertyChangedイベントとCollectionChangedイベントを発生させるだけで、それでうまくいきます。

乾杯ローラン

于 2012-12-17T14:29:25.830 に答える
1

私は以前ほど MvvmLight に精通していませんがasync、さまざまな方法でコンストラクターを処理しようとしました。

オプション (1) にはエラー処理の複雑さがあります。オプション (3) は、強制的InitAsyncにアクセスできるようにします。

async私はファクトリ アプローチ (たとえば、VM の初期化が完了するまで続くオプション (2))を好みDataContextますが、それではうまくいかないようです。そのため (今のところ)、IoC を使用しないファクトリと、理想的ではない他のオプション (1 または 3) のいずれかを選択する必要があります。nullViewModelLocatorasync

個人的には、VM/View のバインドに IoC を使用せず (とにかく IoC を使用することはありません。ビューは VM に依存します)、asyncファクトリ メソッドを使用します。ただし、IoC を使い続けたい場合は、他のオプションも完全に実行可能です。VM の場合、メソッドに常にトップレベルのtry/がある場合、オプション (1) はオプション (3) よりもわずかに優れていると思います。catchInitAsync

于 2012-12-16T21:12:50.240 に答える