【问题标题】:MVVMCross 4.0 Xamarin Forms Page not FoundMVVMCross 4.0 Xamarin 表单页面未找到
【发布时间】:2016-06-01 14:02:30
【问题描述】:

我们使用 MVVMCross 已经 18 个月了。好东西。但是,我们希望从 Xamarin.iOS 迁移到 Xamarin.Forms,以加快开发时间。

我们的 ViewModel 有一个 PCL。但是,希望将我们的视图(页面)放在单独的 PCL 库中,以允许与本机应用程序并行开发。

如果页面位于单独的 PCL 库中,或者如果它位于应用程序中,则 MVVMCross 似乎无法找到该页面。但是,如果我将 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;

    }

但是,还是不开心。

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

谢谢

【问题讨论】:

    标签: mvvmcross xamarin.forms


    【解决方案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 来更改单个程序集查找。

    ...或者(对于 bonus 积分)您可以发送一个拉取请求来更改默认行为以使用视图程序集集合 - 它还可以存储 Dictionary 以避免多次反射通过并加快查找时间。

    【讨论】:

    • 那是斯图尔特,你是真正的摇滚明星。但是,除了重新编译程序集之外,我看不到重写 FormPageLoader 的简单方法。我尝试发送请求请求。我说尝试,因为我以前从未真正这样做过。 :)
    • 只要您在调用github.com/MvvmCross/MvvmCross-Forms/blob/master/… 之前注册自己的Iformpageloader,就会使用您的。 (所以在设置中注册你的……这也是 Mvx 也应该注册的地方……)
    【解决方案2】:

    希望我在 StackOverflow 礼仪方面做得对。使用 Stuart 的建议...快速解决方法是。

    创建一个如下所示的 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>();
        }
    }
    

    【讨论】:

    • 如果你能以某种方式将它与Setup 挂钩,那么你可以使用GetViewAssemblies() 枚举所有“视图”程序集......我真的建议你只找到一次CreatableTypes - 这使用了反射,你真的不想在每个导航中都增加开销。
    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2023-03-06
    • 1970-01-01
    • 2020-06-11
    • 2017-08-29
    相关资源
    最近更新 更多