2011-08-11 5 views
0

は、私は現在、私はに実行している問題はTabViewModelは(ReviewingServicesから)競合を通知することを希望していることである。このMVVM代替イベントパターン

MainWindowViewModel 
    TabViewModel 
     EditorViewModel 
      ReviewingServices 
       ConflictFinder 

のように見えるの階層だけでなく、他のものを持っています。私すべての私の依存関係のためのパブリックゲッターを作成し、私がDependencyA.DependencyB.DependencyC += SomeHandler;と欲しいものを購読するが、それはむしろ乱雑です。私は自分自身が自分が数えたいと思うほど多くの出来事を作り出しているのを見つけています。本質的には、私は厄介な出来事のウェブを作りました。私はクラスごとに作成した責任の分離が大好きですが、すべてのクラスに2〜3回のイベントがあると、それを維持することはむしろ困難です。私は、加入者が1レベル以上の場合、イベントの作成と維持に問題はありません。 ReviewingServiesから発表され、新しいレビュー(を通知するMainWindowViewModel願いが言うとき、混乱が来る。

加入者が深くアプリケーションにネストされているイベントをサブスクライブしたい可能性のあるイベントのこれらのタイプを行うためのよりよいありますか?

答えて

1

本当に問題があるのか​​どうかはわかりませんが、イベントアグリゲータを見てみることをお勧めします。Caliburn oneをチェックしてみてください。タイプを選択してどこからでも購読してください。

1

Microsoft Prismとそのイベントアグリゲーターを使用してみてください

1

連鎖DependencyA.DependencyB.DependencyCは、一般的にはLaw of Demeterを破るとみなされます(依存関係の依存性などに頼っています)。

私は最近、第三のビューモデルを使用してリサイズコントロールに/を持つ2つのviewmodelsの合成コンテキストを注入/私が共有することができ、このようなIMyOperationNameContextなどのインターフェースによって定義Mediatorを使用して、同様の設計上の問題を解決し、そのすべての3つのモデルを直接結合する必要はありません。

このような何か(複数のプロキシとしてどのように、試料中のIAlbumContext行為を注意しますが、サンプルが単純化されているので、それはただです):

interface IAlbumContext 
{ 
    public AlbumInfo SelectedAlbum { get; set; } 
} 

class AlbumContext 
{ 
    AlbumSelectionViewModel _model; 

    public AlbumContext(AlbumSelectionViewModel model) 
    { 
     _model = model; 
    }  

    public Album SelectedAlbum { 
     get { return _model.Album; } 
    } 
} 

class PhotoUploadDialog : Dialog 
{ 
    public PhotoUploadDialog(IAlbumContext context, PhotoUploadViewModel viewModel) 
    { 
    } 
} 

をこのソリューションは、私のために働いたと私はそれがでだと気に入っている間(例えば、そのようなコンテキストインタフェースの数は、アプリケーションに応じて急速に成長する可能性があります)、大規模なスケーラビリティはありません。しかし、より一般的な解決策では、コードの追従が難しくなるというトレードオフがあります。