4

我使用 mvvmcross 为 iOS 和 Android 开发了一个基于 Xamarin 的应用程序。2 周前 Xamarin 宣布 Xamarin.Forms。有人成功地将带有 mvvmcross 的 Xamarin 移植到带有 mvvmcross 的 Camarin.Forms 吗?我想重用我的大部分代码,我正在使用:Messenger、Location、SQLite 等。

如果有人可以提供带有一些 Xamarin.Forms 和 mvvmcross 集成的示例 .sln,那就太好了。我认为 mvvmcross 的开发人员正在努力发布另一个关于这个问题的视频(#43?),但我不确定。

4

2 回答 2

1

Cheesebaron 提供了一个很好的例子,将这些世界结合在一起。

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

我错过了 Cheesebaron 解决方案中的一件重要事情。您不可能将依赖项注入到 ContentPages 中(您可能会争论这是否有意义)。这里的一个用例是 MvvmCross Messenger 插件。例如,如果您想在登录失败时向视图发送消息以显示警报对话框等。

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

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

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>();
    }
}
于 2014-12-05T23:11:26.760 回答
1

github 上有 Cheesebaron 的示例:https ://github.com/Cheesebaron/Xam.Forms.Mvx

于 2014-10-10T18:26:59.553 回答