Ошибка на FreshPageModelResolver.ResolvePageModel <> (); - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь использовать FreshPageModelResolver.ResolvePageModel<>();
, но получаю следующее исключение:

System.Exception: 'XFShell.Pages.MainPage, XFShell, Version = 1.0.0.0, Culture = нейтральный, 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 находятся в папке называется "Страницы".

Это все, если вам нужна дополнительная информация, я предоставлю ее, как только увижу ваш запрос, спасибо всем за потраченное время, надеюсь, что у вас будет хороший день

1 Ответ

0 голосов
/ 10 января 2020

С FreshMvvn Release 2.1.0 добавлена ​​возможность управления отображением PageModel через PageModelMapper. Теперь у нас есть возможность управлять соглашением отображения ViewModel на страницы. Он поддерживает использование Page и ViewModel, таких как Pages и PageModel. Вы делаете это с помощью 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 (AssemblyQualifiedName of MainPage) не может получить правильный тип 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;
    }

enter image description here

Вы можете создать MainPageModel в папке PageModel, чтобы проверить его, используя приведенный ниже код в 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;

Мой результат:

enter image description here

Я загрузил пример кода в папку GitHub FreshMvvm_ViewModelDemo, которую вы можете загрузить для справки. https://github.com/WendyZang/Test.git

...