MvvmCross - 使用activity(context)参数实例化ViewModel

时间:2017-05-18 15:12:38

标签: c# android xamarin mvvm mvvmcross

使用MvvmCross,我创建了一个跨平台的方法来翻译Android和iOS上的字符串,因此我可以在$array2中使用一个共享的$array1方法。我的核心项目中有一个共享接口translate(),在每个平台中,我创建了一个继承自接口的ViewModel类。因此,我的ILocalizationHelper现在包含LocalizationHelper个实例,我可以使用ViewModel方法。

问题:使用ILocalizationHelper在Android上翻译字符串,我需要一个Context(Activity)。因此,实例化此translate()并不简单。目前,我使用GetString()中的LocalizationHelper属性解决了这个问题,我可以从我的视图中进行设置。

我的Translator课程如下:

MvxViewModel

现在我觉得这可能是不好的做法(是吗?)。所以我更喜欢使用ViewModel的构造函数注入我的LocalizationHelper实例。但我不知道如何做到这一点,如果它甚至可能的话:

Fragment

感谢对此最佳做法的任何启示。

3 个答案:

答案 0 :(得分:1)

您可以使用针对当前热门IMvxAndroidCurrentTopActivity注册的Activity来获取您的Android LocalizationHelper实施中的活动上下文。

var context = Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity;

答案 1 :(得分:1)

您可以在DependencyContainer中注册ApplicationContext并将其注入LocalizationHelper实施中。

如果你必须使用当前的活动上下文,你可以将其注册为Func<Context>(并在每次调用Translate时解决它)或者只是执行@ Plac3Hold3r建议的内容并将IMvxAndroidCurrentTopActivity注入你的LocalizationHelper实施。

答案 2 :(得分:1)

初始化Context时应设置LocalizationHelper。我假设这可以被视为一个单身人士,所以最好的地方是来自Android项目中的Setup类。

覆盖InitializeFirstChance()并使用Mvx IoC注册单例。然后,您就可以在ViewModel中使用构造函数注入。

由于单例已捕获上下文,因此ViewModel不必担心它。这几乎就是插件的工作原理(虽然Mvx有插件的自动注册)。

public class Setup : MvxAndroidSetup
{
    private readonly Context _applicationContext;

    public Setup(Context applicationContext) : base(applicationContext)
    {
        // save copy of application context
        _applicationContext = applicationContext;
    }

    protected override void InitializeFirstChance()
    {
        base.InitializeFirstChance();

        // instantiate and register helper
        Mvx.RegisterSingleton<ILocalizationHelper>(new LocalizationHelper(_applicationContext));
    }
}


public class MyViewModel : MvxViewModel
{
    private readonly ILocalizationHelper _localizationHelper;

    // constructor injector of helper singleton
    public MyViewModel(ILocalizationHelper localizationHelper)
    {
        _localizationHelper = localizationHelper;

        // you will now be able to use _localizationHelper from the rest of the ViewModel
    }

}