2012-05-02 10 views
1

私は自分のViewModelLocatorをロールして、アプリケーション内の中央の場所でViewModelを作成するためのtry/catch/logラッパーを提供したいと思います。デフォルトのMvxDefaultViewModelLocatorしかし、私は一般的なものを置き換える方法は見つけられませんでしたが、VMタイプ固有のものを注入するだけでした。MVVMCrossアプリケーションでMvxDefaultViewModelLocatorを置き換える方法

どのように私は、デフォルトの一つとして自分自身ViewModelLocatorクラスを注入する必要がありますか?

答えて

0

これは簡単なことですが...実際にはサンプルには含まれていません!

ViewModelLocatorsの「コンテナ」はMvxApplicationオブジェクトです。デフォルトでは、MvxDefaultViewModelLocatorという規約を使用して、文字列パラメータを持つ宣言されたコンストラクタを使用してViewModelインスタンスを構築しようとします。

例:

public class MyViewModelLocator : MvxViewModelLocator 
{ 
    public MyFirstViewModel CreateFirst() 
    { 
     return new MyFirstViewModel(); 
    } 

    public MySecondViewModel CreateSecond(string aParameter) 
    { 
     var someLookup1 = ComplicatedStaticThing1.Lookup(aParameter); 
     var viewModel = new MySecondViewModel(someLookup1); 

     var someLookup2 = ComplicatedStaticThing2.Lookup(aParameter, someLookup1); 
     viewModel.DoSomething(someLookup2); 

     return viewModel; 
    } 

    private readonly MyThirdViewModel _third = new MyThirdViewModel(); 
    public MyThirdViewModel Third 
    { 
     get 
     { 
      return _third; 
     } 
    } 
} 

あなたがあなた自身のViewModelロケータを使用したい場合は、最も簡単な方法は、MvxViewModelLocatorを継承し、公共のプロパティまたはあなたのViewModelのインスタンスを返すパブリックメソッドのいずれかを提供することは簡単です

これよりも下位に移動する場合は、代わりにIMvxViewModelLocatorを直接実装することもできます。

単純にアプリ内でそれをインスタンス化し、追加し、アプリケーションにViewModelLocatorを追加するには - 例えば:

public class App 
    : MvxApplication 
    , IMvxServiceProducer<IMvxStartNavigation> 
{ 
    public App() 
    { 
     this.RegisterServiceInstance<IMvxStartNavigation>(new StartApplicationObject()); 

     base.AddLocator(new MyViewModelLocator()); 

     // to disable the default ViewModelLocator, use: 
     // base.UseDefaultViewModelLocator = false; 
    } 
} 

注: - 離れて、設計時のデータ用から、私は今まれ非常にカスタムViewModelLocatorを実装する必要があることを知ってください。一般的に、私がやりたいことはViewModelの構築内で行うことができます。

0

私はちょうどあなたの質問を再読み込み....と私は別のものに答え、私はしませんでしたか?ごめんなさい!

のは、もう一度試してみましょう...


デフォルトMvxApplicationは、このメンバーを上書きする方法を提供していません。それが役に立つと思うなら、是非、GitHubを発行してください。しかし、MVXコードを変更せず、その後、私はあなたが探していると思う効果を達成するための一つの方法は、単にのIoC /のServiceProviderの枠組みの中でIMvxViewModelLocatorFinderインターフェイスを交換することである

- あなたは簡単に実現することができます。

public class MyFinder : IMvxViewModelLocatorFinder 
    { 
     public IMvxViewModelLocator FindLocator(MvxShowViewModelRequest request) 
     { 

      return new MyDefaultViewModelLocator(); 
     } 
    } 

これで、クライアントプロジェクトごとにセットアップのInitializeLastChanceの部分でこれを挿入(IoCのアプリケーションエントリを上書き)できますか?あなたの代わりに

をIMvxViewModelLoaderを置き換えることができます - あなたがしたい場合


また、あなたはさらに高く行くことができます

関連する問題