2012-04-02 15 views
2

私はCaliburn Microフレームワークを使用しています。それは実際問題ではありません。重要なのは、イベントモデルにイベントをパブリッシュすることです。イベントモデルには、そのイベント引数に表示される新しいビューモデルが含まれています。このイベントは、実際に新しいビューモデルをアクティブにするShellViewModel(ルートビューモデルとして見ることができます)でキャッチされます。カスタムイベント引数でビューモデルを渡す方法

したがって、イベントの引数にビューモデルを渡すことはできますか?現在のところ、次のようになります。

// where it gets published; "AnotherViewModel" is the actual class 
public void AMethod() 
{ 
    var args = new ViewModelChangedEventArgs { ViewModelType = typeof(AnotherViewModel) }; 
    PublishEvent(args); 
} 

// event handler 
public void Handle(ViewModelChangedEventArgs message) 
{ 
    if (message.ViewModelType == typeof(AnotherViewModel)) 
    { 
     // activate AnotherViewModel 
    } 
    if (message.ViewModelType == typeof(FooViewModel)) 
    { 
     // activate FooViewModel 
    } 
} 

この方法はあまりにもエレガントではないようです。もっと良いアイデアはありますか?

答えて

2

全体的な解決策は、新しいViewModelを作成するのに十分なイベント引数にメタ情報を渡すだけです。 ViewModel自体の作成に関しては、これは標準的な設計上の問題であり、Factory patternを実装することで解決されます。基本的には、型によって具体的なViewModelを作成できるファクトリが必要なので、ハンドラコードは以下のようになります:

public void Handle(ViewModelChangedEventArgs message) 
{ 
    var viewModel = viewModelFactory.Create(typeof(AnotherViewModel)); 
} 
関連する問題