0

我正在尝试使用FreshPageModelResolver.ResolvePageModel<>();
,但出现以下异常:

System.Exception: 'XFShell.Pages.MainPage, XFShell, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null not found'。

对于我在其他页面中看到的,通常的问题是 ViewModel 页面和页面不遵循正确的命名法,但我检查了我的,它似乎是正确的,如果你能告诉我如何解决它,我将不胜感激它。

App.XAML.cs 代码:

public App()
        {
            InitializeComponent();

            var getPage = FreshPageModelResolver.ResolvePageModel<MainViewModel>();
            MainPage = new FreshNavigationContainer(getPage);       
        }

MainViewModel.cs 代码:

    public class MainViewModel : FreshBasePageModel
    {
        public ICommand comando { get; set; }

        public override void Init(object initData)
        {
            comando = new Command(async () =>
            {
                 TheEvent();
            });
        }

        public MainViewModel()
        { }
        private void TheEvent()
        { }

MainPage.XAML.cs 代码:

    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
    }

MainViewModel.cs 位于名为“ViewModels”的文件夹中,而 MainPage.xaml.cs 和 MainPage.xaml 位于名为“Pages”的文件夹中。

就是这样,如果您需要更多信息,我会在看到您的请求后立即提供,谢谢大家的时间,希望您有美好的一天

4

1 回答 1

1

因为FreshMvvn Release 2.1.0,它增加了通过 PageModelMapper 控制 PageModel 映射的能力。我们现在有能力控制将 ViewModel 映射到页面的约定。它支持像 Pages 和 PageModel 一样使用 Page 和 ViewModel。您可以使用如下所示的 IFreshPageModelMapper 来执行此操作。

public class MyPageModelMapper : IFreshPageModelMapper
    {
        public string GetPageTypeName(Type pageModelType)
        {
            var mainpagemodel = typeof(MainPageModel);
            var s = Type.GetType(mainpagemodel.AssemblyQualifiedName);

            var mainviewmodel = typeof(MainViewModel);
            var s2 = Type.GetType(mainviewmodel.AssemblyQualifiedName);

            return pageModelType.AssemblyQualifiedName
                .Replace("PageModel", "Page")
             .Replace("ViewModel", "Page");
        }
    }

我重现了该错误,它通常是由 od MainViewModel 返回 null 类型引起的。这意味着将 ViewModel 替换为 Page 后,name(MainPage 的 AssemblyQualifiedName)无法获得正确类型的 MainPage。所以它抛出了未找到的异常。

 public static Page ResolvePageModel(Type type, object data, FreshBasePageModel pageModel)
    {
        var name = PageModelMapper.GetPageTypeName(s);
        var pageType = Type.GetType(name);
        if (pageType == null)
            throw new Exception(name + " not found");

        var page = (Page)FreshIOC.Container.Resolve(pageType);

        BindingPageModel(data, page, pageModel);

        return page;
    }

在此处输入图像描述

您可以在 PageModel 文件夹中创建一个 MainPageModel 以使用以下代码在 MyPageModelMapper 中检查它。

var mainpagemodel = typeof(MainPageModel);
        var s = Type.GetType(mainpagemodel.AssemblyQualifiedName);

        var mainviewmodel = typeof(MainViewModel);
        var s2 = Type.GetType(mainviewmodel.AssemblyQualifiedName);

然后实现自己的自定义映射器,然后设置PageModelMapper。

 // To set MainPage for the Application  
        FreshPageModelResolver.PageModelMapper = new MyPageModelMapper();
        var page = FreshPageModelResolver.ResolvePageModel<MainViewModel>();
        var basicNavContainer = new FreshNavigationContainer(page);
        MainPage = basicNavContainer;

我的结果:

在此处输入图像描述

我已经在 GitHubFreshMvvm_ViewModelDemo文件夹上上传了示例代码,您可以下载以供参考。 https://github.com/WendyZang/Test.git

于 2020-01-10T02:20:35.390 回答