首页 文章

mvvmcross与Xamarin.Forms

提问于
浏览
4

我开发了一个基于Xamarin for iOS和Andsroid的应用程序,使用mvvmcross . 2周前Xamarin宣布了Xamarin.Forms . 是否有人成功将mamavmcross的Xamarin移植到Camarin.Forms与mvvmcross?我想重用我的大部分代码,我正在使用:Messenger,Location,SQLite等 .

如果有人可以提供样本.sln与一些Xamarin.Forms和mvvmcross集成,那将是很好的 . 我认为mvvmcross的开发人员正在努力发布关于这个问题的另一个视频(#43?),但我不确定 .

2 回答

  • 1

    在github上有来自Cheesebaron的样本:https://github.com/Cheesebaron/Xam.Forms.Mvx

  • 1

    Cheesebaron提供了将这些世界结合在一起的非常好的例子 .

    Ninja Coder VS Extension的创建者Adrian Sudbury计划很快在扩展中发布Xam.Forms MvvmCross选项 .

    我在Cheesebaron的解决方案中错过了一件重要的事情 . 您无法将依赖项注入ContentPages(您可能会认为这是有道理的) . 这里的一个用例是MvvmCross Messenger PlugIn . 例如,如果要向View发送消息以在登录失败时显示警告对话框等 .

    Cheesebaron的MvxPresenterHelper类将ViewModels与ContentPages粘合在一起 . 但是该类没有使用MvvmCross(Mvx)提供的IoC容器,并且自己也在进行反射过程,没有提供将依赖注入视图的能力 .

    我重写了Helper类以使用MvvmCross IoC容器本身 . 您仍然可以在不更改助手代码的情况下使用other containers . 反射将被最小化,因为您不需要扫描整个程序集,只需要扫描存储页面的命名空间 .

    MvxPresenterHelper.cs

    public static ContentPage CreatePage(MvxViewModelRequest request)
        {
            var viewModelName = request.ViewModelType.Name;
            var pageName = viewModelName.Replace("ViewModel", "Page");
            Type pageType = Type.GetType(App.PageNamespace + "." + pageName);
    
            if (pageType == null)
            {
                Mvx.Trace("Page not found for {0}", pageName);
                return null;
            }
    
            var page = Mvx.Resolve(pageType) as ContentPage;
    
            if (page == null)
            {
                Mvx.Error("Failed to create ContentPage {0}", pageName);
            }
            return page;
        }
    

    请注意App.PageNamespace属性 . 它存储ContentPages的特定命名空间 .

    您需要在 App.cs 中注册您的页面

    public class App : MvxApplication
    {
        public static string PageNamespace { get; private set; }
    
        public App()
        {
            PageNamespace = this.GetType().Namespace + ".Pages";
        }
        public override void Initialize()
        {
            // Mvx default registration here
    
            // Register all ContentPages
            this.CreatableTypes()
                .EndingWith("Page")
                .InNamespace(PageNamespace)
                .AsTypes()
                .RegisterAsDynamic();
    
            this.RegisterAppStart<MainViewModel>();
        }
    }
    

相关问题