找不到MVVMCross 4.0 Xamarin表单页面

时间:2016-02-19 20:51:11

标签: mvvmcross xamarin.forms

我们在18个月内一直在使用MVVMCross。好东西。但是,我们正在寻求从Xamarin.iOS迁移到Xamarin.Forms以加快开发时间。

我们有一个带有ViewModel的PCL。但是,希望将我们的View(Pages)放在一个单独的PCL库中,以允许使用Native应用程序进行并行开发。

MVVMCross似乎无法找到页面,如果它位于单独的PCL库中,或者它位于应用程序中。但是,如果我将Page放在与ViewModel相同的PCL中,那么事情就像冠军一样。

我已尝试将以下代码放入Setup.cs

    protected override IEnumerable<Assembly> GetViewAssemblies()
    {
        var list = new List<Assembly>();
        list.AddRange(base.GetViewAssemblies());
        list.Add(typeof(NuSales.Forms.Pages.TestPage).GetTypeInfo().Assembly);
        return list;

    }

但是,仍然没有快乐。

有关如何修复解析程序以查找视图(页面)的任何提示?

由于

2 个答案:

答案 0 :(得分:1)

查看https://github.com/MvvmCross/MvvmCross-Forms/blob/master/MvvmCross.Forms.Presenter.Core/MvxFormsPageLoader.cs#L44

    protected virtual Type GetPageType(string pageName)
    {
        return _request.ViewModelType.GetTypeInfo().Assembly.CreatableTypes()
            .FirstOrDefault(t => t.Name == pageName);
    }

...我想说你需要覆盖默认的IMvxFormsPageLoader来改变那个单一的程序集查找。

...或(对于奖励点)您可以发送一个Pull请求来更改默认行为以使用视图程序集集合 - 它还可以存储Dictionary到{避免多次反射传递并加快查找时间。

答案 1 :(得分:1)

希望我在StackOverflow礼仪方面做得很好。使用斯图尔特的建议......快速修复是。

创建一个FormPageLoader,如下所示。

public class MyFormsPageLoader : MvxFormsPageLoader
{
    public MyFormsPageLoader() {
    }

    protected override Type GetPageType(string pageName)
    {

        return typeof(NuSales.Forms.Pages.TestPage).GetTypeInfo().Assembly.CreatableTypes().FirstOrDefault(t => t.Name == pageName);
    }
}

然后你需要注册它。我在我的App.Initialize代码

中做到了
public class FormsApp : MvxApplication
{
    public override void Initialize()
    {
        base.Initialize();
        Mvx.RegisterSingleton(typeof(IMvxFormsPageLoader), new MyFormsPageLoader());
        RegisterAppStart<TestViewModel>();
    }
}