2012-03-20 113 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...... 
    } 

}