使用来自内容提供商和活动的MvvmCross

时间:2013-04-07 13:35:37

标签: mvvmcross

我正在尝试在我的一个应用程序中使用MvvmCross v3,其中包括活动,内容提供程序和广播接收器。但是,我不太成功。

该应用程序包含一个包含逻辑,模型和视图模型的Core PCL以及一个包含所有MonoDroid特定内容的Droid应用程序。

在Core中我有一个App:MvxApplication类,在Droid中我有一个Setup:MvxSetup类,它创建一个App-instance并初始化东西。

我可以毫无问题地将IOC部分与内容提供商,广播接收者和非Mvx活动一起使用。当我现在想要添加MvxActivity时,它会崩溃。

当Mvx活动启动时,我得到一个异常“Cirrious.CrossCore.Exceptions.MvxException:MvxTrace已经初始化”。

显然我在错误的顺序/错误的位置初始化事物。但是,我需要一个指向正确方向的指针。

我的App类

public class App
    : MvxApplication
{
    public override void Initialize()
    {
        base.Initialize();
        InitialisePlugins();
        InitaliseServices();
        InitialiseStartNavigation();
    }

    private void InitaliseServices()
    {
        CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();
    }

    private void InitialiseStartNavigation()
    {            
    }

    private void InitialisePlugins()
    {
        // initialise any plugins where are required at app startup
        // e.g. Cirrious.MvvmCross.Plugins.Visibility.PluginLoader.Instance.EnsureLoaded();
    }
}

我的设置类

public class Setup
    : MvxAndroidSetup
{
    public Setup(Context applicationContext)
        : base(applicationContext)
    {
    }

    protected override IMvxApplication CreateApp()
    {
        return new App();
    }

    protected override IMvxNavigationSerializer CreateNavigationSerializer()
    {
        return new MvxJsonNavigationSerializer();
    }

    public override void LoadPlugins(Cirrious.CrossCore.Plugins.IMvxPluginManager pluginManager)
    {
        pluginManager.EnsurePluginLoaded<Cirrious.MvvmCross.Plugins.Json.PluginLoader>();
        base.LoadPlugins(pluginManager);
    }

    public void RegisterServices()
    {
        // I register a bunch of singletons here
    }

    // The following is called from my content provider's OnCreate()
    // Which is the first code that is run
    public static void DoSetup(Context applicationContext)
    {
        var setup = new Setup(applicationContext);
        setup.Initialize();
        setup.RegisterServices();
    }

我的内容提供商的OnCreate():

    public override bool OnCreate()
    {
        Log.Debug(Tag, "OnCreate");
        _context = Context;
        Setup.DoSetup(_context);
        return true;
    }

我的Mvx活动:

[Activity(Label = "@string/ApplicationName", MainLauncher = true)]
[IntentFilter(new[] { "Settings" })]
public class SettingsView 
    : MvxActivity
{
    public new SettingsViewModel ViewModel
    {
        get { return (SettingsViewModel) base.ViewModel; }
        set { base.ViewModel = value; }
    }

    protected override void OnViewModelSet()
    {
        SetContentView(Resource.Layout.Page_SettingsView);
    }
}

1 个答案:

答案 0 :(得分:3)

简短回答(我在移动机场)

我怀疑你可以通过单件类创建你的设置,但是如果这不够灵活以满足你的需求,那么请在github上记录一个问题

也希望看到一些关于此的博客 - 我没有太多使用自定义内容提供商(根本没有!)