1 に答える
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を構築するのはかなり簡単です。