这很简单……但实际上在任何示例中都没有!
ViewModelLocators 的“容器”是MvxApplication 对象。默认情况下,它使用基于 MvxDefaultViewModelLocator 的约定,它只是尝试使用其声明的具有字符串参数的构造函数来构造 ViewModel 实例。
如果您想使用自己的 ViewModel 定位器,那么最简单的方法就是从 MvxViewModelLocator 继承并提供返回 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;
}
}
}
如果你想比这更低,那么你也可以直接实现 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 构造中完成。