2017-10-09 87 views
0

是否可以引用位于不同可移植类库中的Viewmodels以及位于不同可移植类库中的Views?请参阅位于单独的可移植类库项目中的ViewModels和Views

我的项目结构如下:

  • SampleApp(便携式) - >查看 - > SecondPage.xaml
  • SampleApp(Droid的)
  • TestVM(类库项目) - >的ViewModels - > SecondPageViewModel

在App.cs,我注册页面如下 Container.RegisterTypeForNavigation<SecondPage, TestVM.ViewModels.SecondPageViewModel>();

它导航到第二页,但构造函数,INavigationAware接口方法没有被调用,mvvm绑定没有工作。

于是我想尝试的解决方案如下Getting Started with Prism’s new ViewModelLocator

解释我已重写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); 
     }); 
    } 

但是我怎么是指哪里我的ViewModels位于组装?

+0

当试图获取视图模型类型时,什么是'viewName','viewAssemblyName'和'viewModelName'?视图模型组件的全称是什么? – Haukinger

+0

@Haukinger ** viewName **:SampleApp.Views.SecondPage, ** viewAssemblyName **:SampleApp,Version = 1.0.0。0,Culture = neutral,PublicKeyToken = null, ** viewModelName **:SampleApp.Views.SecondPageViewModel,SampleApp,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null –

+0

@Haukinger我的视图模型位于TestVM类库项目,程序集名称“TestVM” –

回答

1

您当然可以覆盖ViewModel位置提供程序的默认配置。然而,更简单快捷的方法是使用View/ViewModel注册扩展。就像你可以这样做:

Container.RegisterTypeForNavigation<ViewA>()

你也可以这样做:

Container.RegisterTypeForNavigation<ViewA,ViewAViewModel>()

第二种方法就不再需要通过反射,可以提供稍好的性能来定位视图模型。因为您提供ViewModel,所以您无需担心ViewModel所在的组件,或者您遵循适当的约定。

1

在回答您的评论:

viewModelName:SampleApp.Views.SecondPageViewModel,SampleApp,版本= 1.0.0.0,文化=中立,公钥=空

适应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")}";