2012-05-02 44 views
1

我想推出我自己的ViewModelLocator,以在應用程序中的中心位置爲ViewModel創建提供try/catch/log包裝器,以便能夠替代我必須替換默認的MvxDefaultViewModelLocator。但是我沒有找到替代通用的方法,只是爲了注入特定類型的虛擬機。如何替換MVVMCross應用程序中的MvxDefaultViewModelLocator

我應該如何注入我自己的ViewModelLocator類作爲默認的?

回答

0

這是直接做...但實際上並沒有在任何樣品!

ViewModelLocators的「容器」是MvxApplication對象。默認情況下,它使用基於約定的MvxDefaultViewModelLocator,它試圖通過使用具有字符串參數的聲明構造函數來構造ViewModel實例。

如果你想用你自己的視圖模型定位,那麼最簡單的方法就是簡單的從MvxViewModelLocator繼承和成提供的公共屬性或返回您的視圖模型實例的公共方法:

如:

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; 
     } 
    } 
} 

如果你想要比這更低,那麼你也可以直接實現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代碼,然後一個方法來實現,我認爲你正在尋找的是簡單地更換IMvxViewModelLocatorFinder接口在IOC /的ServiceProvider框架的效果 - 你可以很容易實現:

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

      return new MyDefaultViewModelLocator(); 
     } 
    } 

然後你可以在安裝的InitializeLastChance部分爲每個客戶端項目注入此項(覆蓋IoC中的應用程序項)?你可以取代IMvxViewModelLoader代替

-


或者,你可以,如果你想去更高

相關問題