像MVVM Light这样的Messenger插件的默认实例(可能是静态的)

时间:2014-01-23 16:57:24

标签: xamarin.ios mvvmcross

MVVMCross与MVVM Light的Messenger.Default实例是否相同(对于Xamarin.iOS中不符合MVVM的独立项目)。

查看thisthisthis

等帖子后

我决定将“MvvmCross Messenger”插件添加到PCL和iOS项目中。以为我必须注册Hub并通过类似

的方式从PCL和iOS项目中解决它
// Registering in ViewDidLoad() of iOS project
Mvx.RegisterSingleton<IMvxMessenger>(new MvxMessengerHub());

// Try to resolve and subscribe in PCL and iOS project - both have nuget packages added
_messenger = Mvx.Resolve<IMvxMessenger> ();
_token = _messenger.SubscribeOnMainThread<MyMessage> ((message) => {
    OutputLabel.Text = message.Number;
});

但是我在Mvx.RegisterSingleton处获得了一个空引用异常。不太确定我错过了什么。我正在寻找的就是使用Messenger。不要在此项目中立即使用MVVM的任何其他部分

1 个答案:

答案 0 :(得分:2)

在MvvmCross中,我们将messenger设为可选 - 所以它在插件中。

如果您想独立使用它,那么您可以使用CrossLight演示中显示的代码启动插件系统 - 请参阅http://mvvmcross.blogspot.co.uk/中的N = 30和N = 39 - 并查看仅限android的演示在https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/CrossLight/PluginUse/NoBinding/Setup.cs

对于iOS,您可能需要一些一次性初始化代码,例如:

        if (MvxSimpleIoCContainer.Instance != null)
            return;

        var ioc = MvxSimpleIoCContainer.Initialize();

        ioc.RegisterSingleton<IMvxTrace>(new MvxDebugOnlyTrace());
        var manager = new MvxLoaderPluginManager();
        var registry = new MvxLoaderPluginRegistry(".Touch", manager);                          
        ioc.RegisterSingleton<IMvxPluginManager>(manager);

信使本身的代码位于:https://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/Messenger/Cirrious.MvvmCross.Plugins.Messenger/MvxMessengerHub.cs

或者......如果你不想要Mvx代码用于绑定,调度程序等,那么使用像TinyMessenger这样的优秀东西可能更容易 - https://github.com/grumpydev/TinyMessenger