【问题标题】:Prism - How to import IRegionManager in ViewModel using MEFPrism - 如何使用 MEF 在 ViewModel 中导入 IRegionManager
【发布时间】:2012-03-20 15:41:02
【问题描述】:

我们如何使用 MEF Container 在 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 而失败。这似乎是合乎逻辑的,因为上面的 View Model 是 WPF 通过 Xaml 中的 DataContext 属性构造的,并且 DI 没有发挥作用,因此它没有机会导入 RegionManager 实例。在这种情况下我们如何解析 IRegionManager。

【问题讨论】:

    标签: wpf prism prism-4


    【解决方案1】:

    Container 实例可以使用以下方法在引导程序中导出

        container.ComposeExportedValue<CompositionContainer>(container);
    

    然后在viewmodel中,可以使用代码导入IRegionManager实例

        IServiceLocator serviceLocator = ServiceLocator.Current;
        CompositionContainer container = serviceLocator.GetInstance<CompositionContainer>();
        RegionManager = container.GetExportedValue<IRegionManager>();
    

    但是,在 ViewModel 中引用视图违反了 MVVM 模式。但是由于我是在关注一篇文章here 来学习 Prism ,所以我不得不相处得一样。这篇文章也在 Silverlight 中,我必须找到一种在 wpf 中导入 RegionManager 的方法,这有点不同。

    问候, 涅槃。

    【讨论】:

      【解决方案2】:

      尝试像这样使用 [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......
         }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 2012-09-03
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-02-23
        相关资源
        最近更新 更多