2012-03-20 85 views
3

如何使用MEF容器在ViewModel中注入IRegionManager。我必须在ViewModel的Command委托中切换视图。以下是我正在做的事情的简要描述。我有一个名为Product的实体,其列表显示在一个View(ProductListView)中。在该视图中,用户可以选择产品并点击编辑按钮。这将切换视图并呈现一个新的视图(ProductEditView)。对于激活了不同的看法,我需要这样的棱镜 - 如何使用MEF在ViewModel中导入IRegionManager使用MEF

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. 
     .... 
    } 
} 

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

回答

4

容器实例可以使用在视图模型以下

container.ComposeExportedValue<CompositionContainer>(container); 

然后,引导程序被导出,所述IRegionManager实例可以使用的代码

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

然而进口,参照在视图模型视图违反了MVVM模式。但是因为我在跟着一篇文章here去学习棱镜,所以我不得不相处。另外这篇文章是在Silverlight中,我不得不找到一种方法来导入wpf中的RegionManager,这有点不同。

关于, Nirvan。

1

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

}