2010-03-26 13 views
3

Je n'arrive pas à comprendre comment passer des paramètres à mes modèles de vue à partir d'autres vues ou modèles de vue.Passer des paramètres dans ViewModels (Prism)

Par exemple, j'ai une vue appelée Clients. Il y a une grille à l'intérieur, et si vous double-cliquez sur la grille, une nouvelle vue est censée apparaître et vous permettre d'éditer les données de ce client. Mais comment la View (Model) responsable de l'édition des données va-t-elle savoir quel client elle est censée ouvrir si je ne peux pas passer de paramètres à l'intérieur?

EventAggregator est hors de question car je ne peux évidemment pas créer des centaines d'arguments, chacun pour une vue. Et d'ailleurs, c'est une solution minable.

Jusqu'à présent, j'ai pu venir avec:

CustomerDataView custView = new CustomerDataView(customerId, currentContext); 
manager.Regions[RegionNames.Sidebar].AddAndActivate(custView); 

Que pensez-vous de cette solution particulière? Est-ce la façon dont c'est normalement fait? Ce que je n'aime pas à ce sujet est le fait que je perds sur l'injection de dépendance automatique par Unity.

Répondre

3

C'est ce que M est pour MVVM. Par exemple. avoir un modèle partagé (injecté par Unity dans le constructeur) par la grille des clients et l'éditeur du client. Lorsque le double clic se produit dans le gird, l'instance client est définie dans le modèle. Lorsque la vue de l'éditeur est créée, viewmodel obtient le client du modèle. En ce qui concerne la perte de l'injection de dépendance automatique, vous avez mentionné que vous pourriez utiliser la méthode CreateChildContainer(). Exemple:

using (var childContainer = _container.CreateChildContainer()) 
{ 
    childContainer.RegisterInstance(customerId); 
    var custView = childContainer.Resolve<CustomerDataView>(); 
    manager.Regions[RegionNames.Sidebar].AddAndActivate(custView); 
} 
5

Vous pouvez également mettre à niveau votre Unity vers la dernière version, qui prend en charge les «remplacements de paramètres».

MyType mt = container.Resolve<MyType>(
         new ParameterOverride("customerId", customerId)); 

C'est ce que j'ai fait. Nous avons constaté que les sous-conteneurs maintenaient une référence circulaire à leur parent et ne collecteraient pas correctement (mémoire fuite) donc nous avons mis à jour et opté pour cette méthode.

+0

lorsque le paramètre parametererrerride est une instance de classe personnalisée, le code ne peut pas fonctionner correctement, mais s'il s'agit d'une valeur de chaîne ou d'une valeur int, le code fonctionne correctement. – huoxudong125

Questions connexes