Обратитесь к ViewModels и Views, которые находятся в отдельном проекте Portable Class Library

Можно ли ссылаться на Viewmodels, которые находятся в отдельной переносимой библиотеке классов, и Views, которые находятся в другой переносимой библиотеке классов?

Моя структура проекта выглядит следующим образом:

  • SampleApp (Portable) -> Представления -> SecondPage.xaml
  • SampleApp (Droid)
  • TestVM (проект библиотеки классов) -> ViewModels -> SecondPageViewModel

В App.cs я зарегистрировал страницу следующим образомContainer.RegisterTypeForNavigation<SecondPage, TestVM.ViewModels.SecondPageViewModel>();

Он перешел на SecondPage, но конструктор, методы интерфейса INavigationAware не были вызваны, а привязки mvvm не сработали.

Итак, я хотел попробовать решение, как описано здесь Начало работы с новым ViewModelLocator от Prism.

Я переопределил ConfigureViewModelLocator

 protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();
        ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
        {
            var viewName = viewType.FullName;
            var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
            var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName);
            return Type.GetType(viewModelName);
        });
    }

Но как мне обратиться к сборке, где расположены мои view-модели?

2 ответа

Решение

Конечно, вы можете переопределить конфигурацию по умолчанию для провайдера местоположения ViewModel. Однако более простой и быстрый способ заключается в использовании расширения регистрации View / ViewModel. Так же, как вы можете сделать:

Container.RegisterTypeForNavigation<ViewA>()

Вы также можете сделать:

Container.RegisterTypeForNavigation<ViewA,ViewAViewModel>()

Второй метод устраняет необходимость определять ViewModel с помощью отражения, что может обеспечить немного лучшую производительность. Поскольку вы предоставляете ViewModel, вам не нужно беспокоиться о том, в какой сборке находится ViewModel или соблюдаете ли вы соответствующие соглашения.

В ответ на ваш комментарий:

viewModelName: SampleApp.Views.SecondPageViewModel, SampleApp, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken=null

адаптироваться var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName); так что это производит ваше фактическое имя модели представления

TestVM.ViewModels.SecondPageViewModel, TestVM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Нечто подобное

var viewModelName = $"{viewName.Replace("SampleApp","TestVM")}ViewModel, {viewAssemblyName.Replace("SampleApp","TestVM").Replace("Views","ViewModels")}";
Другие вопросы по тегам