我想推出我自己的ViewModelLocator,以在應用程序中的中心位置爲ViewModel創建提供try/catch/log包裝器,以便能夠替代我必須替換默認的MvxDefaultViewModelLocator。但是我沒有找到替代通用的方法,只是爲了注入特定類型的虛擬機。如何替換MVVMCross應用程序中的MvxDefaultViewModelLocator
我應該如何注入我自己的ViewModelLocator類作爲默認的?
我想推出我自己的ViewModelLocator,以在應用程序中的中心位置爲ViewModel創建提供try/catch/log包裝器,以便能夠替代我必須替換默認的MvxDefaultViewModelLocator。但是我沒有找到替代通用的方法,只是爲了注入特定類型的虛擬機。如何替換MVVMCross應用程序中的MvxDefaultViewModelLocator
我應該如何注入我自己的ViewModelLocator類作爲默認的?
這是直接做...但實際上並沒有在任何樣品!
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構造中完成。
我剛剛重讀你的問題....我回答了另一個問題,不是嗎?抱歉!
讓我們再試試......
默認MvxApplication不提供任何方法來覆蓋這個成員。如果你認爲它會有用,那麼通過一切手段提出問題或拉動GitHub。
然而,在不改變MVX代碼,然後一個方法來實現,我認爲你正在尋找的是簡單地更換IMvxViewModelLocatorFinder接口在IOC /的ServiceProvider框架的效果 - 你可以很容易實現:
public class MyFinder : IMvxViewModelLocatorFinder
{
public IMvxViewModelLocator FindLocator(MvxShowViewModelRequest request)
{
return new MyDefaultViewModelLocator();
}
}
然後你可以在安裝的InitializeLastChance
部分爲每個客戶端項目注入此項(覆蓋IoC中的應用程序項)?你可以取代IMvxViewModelLoader代替
或者,你可以,如果你想去更高