2010-12-15 14 views
1

Ich benutze Calibrn Micro und MEF in WPF und ich habe dieses Problem.Parameter vom Ansichtsmodell zum Konstruktor eines anderen Ansichtsmodells senden

Ich schaffe Shell-View-Modell:

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)); 
    } 
} 

Aus Sicht-Modell

ich schaffen und zeigen in neue Ansicht-Modell
[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); 
     } 
    } 
} 

Problem ist hier

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

New Ansichtsmodell

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

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

Problem ist hier:

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

Parameter IoC.Get() nur Zeichenfolge sein kann.

Wie dieses Problem lösen?

Antwort

2

Ich würde nicht die IoC-Klasse in diesem Zusammenhang, da dies ein Beispiel für das anti-Muster Service Locator ist, und wird nicht empfohlen. Rob erwähnt dies in seiner Caliburn.Micro-Dokumentation. Sie können auch http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx für eine schöne Beschreibung des Anti-Pattern lesen.

Stattdessen würde ich ein abstraktes Werk Muster, verwendet und weitergeben (eine Abstraktion) eine Fabrik in der Shell View-Modell. Dies kann über Methoden zum Erstellen eines neuen Anmeldeansichtsmodells und eines Messenger-Ansichtsmodells verfügen. In der konkreten Implementierung dieser Factory können Sie diese Ansichtsmodelle von Hand instanziieren und einfach die benötigten Informationen übergeben.

Ich würde auch den Verweis auf das Shell-View-Modell aus dem Anmeldeansichtsmodell entfernen. Verwenden Sie stattdessen entweder Standard-.NET-Ereignisse, die die Shell abonnieren kann, oder sehen Sie sich den in Caliburn.Micro implementierten Ereignisaggregator an (ein Beispiel ist auf der Codeplex-Site verfügbar), bei dem es sich um eine Implementierung des Mediator-Entwurfsmusters handelt. Dies sorgt für eine gute Entkopplung zwischen Ihren Ansichtsmodellen.

+0

Vielen Dank für Fortschritte, ich versuche ihre ... –