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>();
}
}