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