4
4

1 に答える 1

5

MvvmCrossの珍しい(意見のある)機能の1つは、デフォルトでナビゲーションメカニズムの一部としてViewModelコンストラクターパラメーターを使用することです。

これは、ViewModelから別のビュー(MVVMCross)への変数の受け渡しに対する私の回答の例で説明されています

基本的な考え方は、HomeViewModelが以下を使用してナビゲーションを要求する場合です。

private void DoSearch()
{
    RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
}

次に、これにより、コンストラクターに渡されたsearchTermを使用してTwitterViewModelが構築されます。

public TwitterViewModel(string searchTerm)
{
    StartSearch(searchTerm);
}

現在、これは、すべてのViewModelに、パラメーターがないか、文字列パラメーターのみがあるパブリックコンストラクターが必要であることを意味します。

したがって、ViewModelがロードされない理由は、MvxDefaultViewModelLocatorがViewModelに適したコンストラクターを見つけることができないためです。


GetService<IServiceType>()「サービス」の場合、MvvmCrossフレームワークは、拡張メソッドを使用して最も簡単にアクセスできる単純なiocコンテナーを提供します。たとえば、Twitterサンプルでは、​​ViewModelの1つに次のものが含まれています。

public class TwitterViewModel
    : MvxViewModel
    , IMvxServiceConsumer<ITwitterSearchProvider>
{
    public TwitterViewModel(string searchTerm)
    {
        StartSearch(searchTerm);
    }

    private ITwitterSearchProvider TwitterSearchProvider
    {
        get { return this.GetService<ITwitterSearchProvider>(); }
    }

    private void StartSearch(string searchTerm)
    {
        if (IsSearching)
            return;

        IsSearching = true;
        TwitterSearchProvider.StartAsyncSearch(searchTerm, Success, Error);
    }

    // ...
}

同様に、 ConferenceBaseViewModelで会議サービスデータがどのように消費されるかを確認できます。


ViewModelに他のIoCコンテナまたは他の構築メカニズムを使用する場合は、MvvmCross内でViewModel構築をオーバーライドできます。

これを行う方法のアイデアについては、この質問(および回答)を参照してください-MVVMCrossアプリケーションでMvxDefaultViewModelLocatorを置き換える方法

たとえば、必要に応じて、MyViewModelLocatorその質問の例を調整して、サービスでViewModelを構築するのはかなり簡単です。

于 2012-05-09T08:32:59.483 に答える