2010-12-15 64 views
1

J'utilise caliburn micro et MEF en wpf et j'ai ce problème.envoyer un paramètre de view-model au constructeur d'un autre view-model

Je crée shell-vue-modèle:

public interface IShellViewModel 
{ 
    void ShowLogOnView(); 
    void ShowMessengerView(PokecAccount account); 
} 

[Export(typeof(IShellViewModel))] 
public class ShellViewModel : Conductor<IScreen>, IShellViewModel 
{ 
    public ShellViewModel() 
    { 
     ShowLogOnView(); 
    } 

    public void ShowLogOnView() 
    { 
     ActivateItem(IoC.Get<LogOnViewModel>()); 
    } 

    public void ShowMessengerView(PokecAccount account) 
    { 
     //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class) 
     ActivateItem(IoC.Get<MessengerViewModel>(account)); 
    } 
} 

De vue-modèle créer et spectacle dans la nouvelle vue-modèle

[Export] 
public class LogOnViewModel : Screen, IDataErrorInfo, ILogOnViewModel 
{ 


    [Import] 
    private IShellViewModel _shellViewModel; 

    [Import] 
    private IPokecConnection _pokecConn; 

    private PokecAccount _account; 

    public void LogOn(string nick, string password) 
    { 
     _account = _pokecConn.LogOn(nick, password); 
     if (_account != null) 
     { 
      //create new view-model and show it, problem is send parameter to construtor of MessengerViewModel 
      _shellViewModel.ShowMessengerView(_account); 
     } 
    } 
} 

Le problème est ici

 //send to constructor of MessangerViewModel paramter typeof PokecAccount(own class) 
     ActivateItem(IoC.Get<MessengerViewModel>(account)); 

Nouveau voir-modèle

[Export] 
public class MessengerViewModel : Screen, IMessengerViewModel 
{ 
    private PokecAccount _account; 

    public MessengerViewModel(PokecAccount account) 
    { 
     _account = account; 
    } 
} 

Le problème est ici:

//send to constructor of MessangerViewModel paramter typeof PokecAccount(own class) 
    ActivateItem(IoC.Get<MessengerViewModel>(account)); 

Paramètre IoC.Get() ne peut être que la chaîne.

Comment résoudre ceci?

Répondre

2

Je n'utiliserais pas la classe IoC dans ce contexte, car il s'agit d'un exemple d'anti-pattern de localisateur de service, et n'est pas recommandé. Rob mentionne cela dans sa documentation Caliburn.Micro. Vous pouvez également lire http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx pour une bonne description de l'anti-modèle. Au lieu de cela, j'utiliserais un motif d'usine abstrait, et passerais (une abstraction de) une usine dans votre modèle de vue de coquille. Cela peut avoir des méthodes pour créer un nouveau modèle de vue d'ouverture de session et un modèle de vue messenger. Dans l'implémentation concrète de cette fabrique, vous pouvez instancier manuellement ces modèles de vue et transmettre simplement les informations dont ils ont besoin.

Je supprimerais également la référence au modèle de vue shell à partir du modèle de vue de connexion. Au lieu de cela, utilisez les événements .NET standard auxquels le shell peut s'abonner, ou jetez un oeil à l'agrégateur d'événements implémenté dans Caliburn.Micro (un exemple est disponible sur le site codéplex), qui est une implémentation du modèle de conception médiateur. Cela assurera un bon découplage entre vos modèles de vue.

+0

Merci pour les avancées, j'essaie de mettre en œuvre leur ... –