我们如何使用 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/

10-17 01:17