2010-12-15 5 views
1

私はwpfでcaliburnマイクロとMEFを使用していますが、この問題があります。ビューモデルから別のビューモデルのコンストラクタにパラメータを送信

私はシェル・ビュー・モデルを作成:

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

私が作成したビュー・モデルとショーから新しいビュー・モデルに

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

問題はここに

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

ある新ビューモデル

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

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

問題はここにある:

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

パラメータIoC.Getは()のみの文字列を指定できます。

どのように解決しますか?

答えて

2

この文脈ではIoCクラスは使用しません。これはサービスロケータのアンチパターンの例であり、推奨されていません。 RobはCaliburn.Microのドキュメントでこれを述べています。アンチパターンについては、http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspxをご覧ください。

代わりに、抽象的なファクトリパターンを使用して、ファクトリをファクトリビューモデルに渡します(抽象化)。これには、新しいログオンビューモデルとメッセンジャービューモデルを作成するメソッドがあります。このファクトリの具体的な実装では、これらのビューモデルを手作業でインスタンス化し、必要な情報を渡すだけです。

また、ログオンビューモデルからシェルビューモデルへの参照も削除されます。代わりに、シェルが購読可能な標準の.NETイベントを使用するか、Caliburn.Microに実装されているイベントアグリゲータ(サンプルはコードプレックスサイトで利用可能です)を参照してください。これはメディエータのデザインパターンの実装です。これにより、ビューモデル間のデカップリングが良好になります。

+0

進歩していただきありがとうございます、私はそれらを実装しようとしています... –

関連する問題