请参阅位于单独的可移植类库项目中的ViewModel和Views

时间:2017-10-09 11:29:13

标签: xamarin.forms prism

是否可以引用位于不同可移植类库中的Viewmodel和位于不同可移植类库中的Views?

我的项目结构如下:

  • SampleApp(Portable) - >意见 - > SecondPage.xaml
  • SampleApp(德罗伊德)
  • TestVM(类库项目) - > ViewModels - > SecondPageViewModel

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

导航到SecondPage但是构造函数,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);
        });
    }

但是如何引用我的viewmodel所在的程序集?

2 个答案:

答案 0 :(得分:1)

回应你的评论:

  

viewModelName:SampleApp.Views.SecondPageViewModel,SampleApp,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null

调整canvas.style.width="100%"以便生成实际视图模型名称:

var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName);

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

答案 1 :(得分:1)

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

Container.RegisterTypeForNavigation<ViewA>()

你也可以这样做:

Container.RegisterTypeForNavigation<ViewA,ViewAViewModel>()

第二种方法消除了通过反射定位ViewModel的需要,这可以提供稍微更好的性能。因为您提供了ViewModel,所以您无需担心ViewModel所处的程序集,或者您是否遵循了正确的约定。