2012-03-20 2 views
3

Comment injecter IRegionManager dans le ViewModel en utilisant MEF Container. Je dois changer de vue dans le délégué de commande de mon ViewModel. Voici la brève description de ce que je fais. J'ai une entité appelée Product dont la liste est affichée dans une vue (ProductListView). Dans cette vue, l'utilisateur peut sélectionner le produit et cliquer sur le bouton Modifier. Cela changerait la vue et présenterait une nouvelle vue (ProductEditView). Pour activer un point de vue différent, je aurais besoin d'une référence à IRegionManager quelque chose comme çaPrism - Comment importer IRegionManager dans ViewModel en utilisant 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. 
     .... 
    } 
} 

Le code ci-dessus échoue avec NullReferenceException pour RegionManager. Cela semble logique parce que le modèle de vue ci-dessus est construit par WPF à travers la propriété DataContext dans Xaml et DI ne joue pas, donc il n'a pas la chance d'importer l'instance de RegionManager. Comment résolvons-nous IRegionManager dans ce scénario.

Répondre

4

L'instance conteneur peut être exporté dans le programme d'amorçage à l'aide suivante

container.ComposeExportedValue<CompositionContainer>(container); 

Ensuite, dans le viewmodel, l'instance IRegionManager peut être importé en utilisant le code

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

Cependant, se référant une vue dans ViewModel est une violation du modèle MVVM. Mais puisque je suivais un article here pour apprendre le prisme, je devais me débrouiller pareil. L'article était également dans Silverlight et j'ai dû trouver un moyen d'importer RegionManager dans wpf, ce qui est peu différent.

concerne, Nirvan.

1

Essayez d'utiliser [ImportingConstructor] comme ceci:

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

}

Questions connexes