我们如何使用 MEF Container 在 ViewModel 中注入(inject) IRegionManager。我必须在我的 ViewModel 的命令委托(delegate)中切换 View 。这是我正在做的事情的简要说明。我有一个名为 Product 的实体,其列表显示在一个 View (ProductListView) 中。在该 View 中,用户可以选择产品并单击“编辑”按钮。这将切换 View 并呈现一个新的 View (ProductEditView)。为了激活不同的 View ,我需要对 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 而失败。这似乎是合乎逻辑的,因为上面的 View 模型是由 WPF 通过 Xaml 中的 DataContext 属性构建的,并且 DI 没有发挥作用,因此它没有机会导入 RegionManager 实例。在这种情况下我们如何解决 IRegionManager。
最佳答案
可以使用以下命令在 bootstrap 中导出 Container 实例
container.ComposeExportedValue<CompositionContainer>(container);
然后在viewmodel中,可以使用代码导入IRegionManager实例
IServiceLocator serviceLocator = ServiceLocator.Current;
CompositionContainer container = serviceLocator.GetInstance<CompositionContainer>();
RegionManager = container.GetExportedValue<IRegionManager>();
但是,在 ViewModel 中引用 View 违反了 MVVM 模式。但是由于我是在关注 here 的一篇文章来学习 Prism 的,所以我也不得不这样做。另外这篇文章是在 Silverlight 中的,我必须找到一种在 wpf 中导入 RegionManager 的方法,这几乎没有什么不同。
问候,
涅盘。
关于wpf - Prism - 如何使用 MEF 在 ViewModel 中导入 IRegionManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9789990/