Обратитесь к 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")}";