2013-02-14 1 views
3

J'essaye de créer un module avec PRISM et maintenant je mets le DataContext dans la vue ce qui signifie que je ne peux utiliser qu'un constructeur sans paramètre, mais cela signifie que je ne peux pas utiliser l'injection de dépendance (j'utilise Unity) le constructeur que je voudraisDéfinition de datacontext avec prisme

S'il est possible que je voudrais ni le point de vue ou la machine virtuelle pour connaître et que vous voulez utiliser quelque chose comme

private void RegisterServices() 
{ 
    var employeeViewModel = new EmployeeViewModel(); 

    _container.RegisterType<IEmployeeViewModel, EmployeeViewModel>(); 
    _container.RegisterType<EmployeeView>(); 

    EmployeeView.Datacontext = employeeViewModel; 
} 

que je vous inscrire dans le EmployeeModule

Est-ce possible le ou devrais-je utiliser le code derrière?

Répondre

2

Vous pouvez passer l'interface de ViewModel au View dans le constructeur. De cette façon, View ne connaît que l'interface de ViewModel et ViewModel ne sait rien sur le View.

Ex.

public class EmployeeView : UserControl 
{ 
    public EmployeeView(IEmployeeViewModel vm) 
    { 
     this.DataContext = vm; //// better to set the ViewModel in the Loaded method 
    } 
} 

Référez-vous à this blog post pour plusieurs approches d'instanciation MVVM.

+0

Mais ce ne est pas possible de ne pas avoir quoi que ce soit dans le code derrière? – Mech0z

+0

vous pouvez créer le ViewModel en tant que ressource dans le xaml; alors vous ne pouvez pas utiliser le conteneur unity. vous pouvez juste créer une classe de base pour vos vues, alors vous avez seulement besoin d'hériter de la classe de base dans le code derrière. Vous devez déclarer une relation entre ViewModel et View. Reportez-vous au lien dans la question. – daryal

1

Prism documentation vous donne une option

Souvent, vous trouverez utile de définir un contrôleur ou classe de service pour coordonner l'instanciation de la vue et vue sur les classes modèle. Cette approche peut être utilisée avec un conteneur d'injection de dépendances, tel que en tant que MEF ou Unity, ou lorsque la vue crée explicitement son modèle de vue requise .

Pour mon module, je ferais ce qui suit
Créer une interface pour le service intérieur du module

public interface ICustomModuleUiService 
{ 
    void ShowMainView(); 
    void ShowExtraView(); 
} 

mise en œuvre de la production dans le même module:

class CustomModuleUiService : ICustomModuleUiService 
{ 
    private readonly IEventAggregator _eventAggregator; 

    public CustomModuleUiService(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
    } 

    public void ShowMainView() 
    { 
     var ddsViewModel = new DdsViewModel(_eventAggregator, this); 
     DdsForm form = new DdsForm(); 
     form.DataContext = ddsViewModel; 
     form.Show(); 
    } 

    public void ShowExtraView() 
    { 
     //some code here 
    } 
} 

Et enfin module de code

[ModuleExport("DssModule", typeof(DssModuleImpl))] 
public class DssModuleImpl : IModule 
{ 
    private readonly IEventAggregator _eventAggregator; 
    private ICustomModuleUiService _uiService; 

    [ImportingConstructor] 
    public DssModuleImpl(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
     _uiService = new CustomModuleUiService(_eventAggregator); 
    } 

    public void Initialize() 
    { 
     _eventAggregator.GetEvent<OpenDdsFormEvent>().Subscribe(param => _uiService.ShowMainView()); 
    } 
} 

En utilisant cette approche, je vais

  • ViewModel peut être testé unitairement
  • Je peux modifier dynamiquement la réaction sur OpenDdsFormEvent en substituant la mise en œuvre de ICustomModuleUiService
Questions connexes