Wpf Prism-如何使用MEF在ViewModel中导入IRegionManager

Wpf Prism-如何使用MEF在ViewModel中导入IRegionManager,wpf,prism,prism-4,Wpf,Prism,Prism 4,如何使用MEF容器在ViewModel中注入IRegionManager。我必须在ViewModel的命令委托中切换视图。下面是我正在做的事情的简要描述。我有一个名为Product的实体,其列表显示在一个视图(ProductListView)中。在该视图中,用户可以选择产品并单击编辑按钮。这将切换视图并显示一个新视图(ProductEditView)。要激活另一个视图,我需要对IRegionManager的引用 public class ProductListVM : NotificationO

如何使用MEF容器在ViewModel中注入IRegionManager。我必须在ViewModel的命令委托中切换视图。下面是我正在做的事情的简要描述。我有一个名为Product的实体,其列表显示在一个视图(ProductListView)中。在该视图中,用户可以选择产品并单击编辑按钮。这将切换视图并显示一个新视图(ProductEditView)。要激活另一个视图,我需要对IRegionManager的引用

public class ProductListVM : NotificationObject { //The Product List View Model
    [Import]
    public IRegionManager RegionManager { get; set; }

    private void EditProduct() { //EditCommand fired from ProductListView
        IRegion mainContentRegion = RegionManager.Regions["MainRegion"];
        //Switch the View in "MainContent" region.
        ....
    }
}

上述代码失败,RegionManager出现NullReferenceException。这似乎是合乎逻辑的,因为上面的视图模型是由WPF通过Xaml中的DataContext属性构建的,DI没有发挥作用,所以它没有机会导入RegionManager实例。在这种情况下,我们如何解析IRegionManager。

可以使用以下命令在引导程序中导出容器实例

    container.ComposeExportedValue<CompositionContainer>(container);
container.ComposeExportedValue(container);
然后在viewmodel中,可以使用以下代码导入IRegionManager实例

    IServiceLocator serviceLocator = ServiceLocator.Current;
    CompositionContainer container = serviceLocator.GetInstance<CompositionContainer>();
    RegionManager = container.GetExportedValue<IRegionManager>();
IServiceLocator serviceLocator=serviceLocator.Current;
CompositionContainer=serviceLocator.GetInstance();
RegionManager=container.GetExportedValue();
但是,在ViewModel中引用视图违反了MVVM模式。但因为我是跟着一篇文章学习棱镜的,所以我也不得不和它相处。这篇文章也是在Silverlight上发表的,我必须找到一种在wpf中导入RegionManager的方法,这一点差别不大

问候,,
Nirvan。

尝试使用如下[ImportingConstructor]:

public class ProductView : Window
{
  private IProductViewModel viewModel;


   [ImportingConstructor]
   public ProductView(IProductViewModel ViewModel)
   {
       this.viewModel = ViewModel;
       this.DataContext = this.viewModel;
   }
}


public class ProductViewModel: IProductViewModel, INotifyPropertyChanged
{
   private IRegionManager regionManager;
   private ICommand editUserCommand;

   [ImportingConstructor]
   public ProductViewModel(IRegionManager InsertedRegionManager)
   {
      this.regionManager = InsertedRegionManager;
      editUserCommand = new DelegateCommand(ExecuteEditUserCommand, CanExecuteEditUserCommand);
   }

   public ICommand EditUserCommand
   {
       get {return this.editUserCommnad;}
   }

   private bool CanExecuteEditUserCommand()
   {
      return true;
   }

   private void ExecuteEditUserCommand()
   {
      this.regionManager......
   }
}