2012-02-16 18 views
1

現在、私はプリズムを学んでいる。私はテストアプリケーションをビルドしており、ボタンをクリックすると領域にビューを注入する必要があります。私はビューモデルでこのコードを使用してそれを行う方法を知っていますプリズム4で注入を観察し、依存を避ける

IRegion region = _regionManager.Regions[RegionNames.TicketEditorRegion]; 
TicketEditorView view = _componentContainer.Resolve<TicketEditorView>(); 
region.Add(view); 

これは私がモジュール間の参照を追加する必要があるという問題です。私はこれが望ましいことではないと思う。 一部のRegionBuilderThing用のインターフェイスを追加し、ビューモデル内でそれを単一で解決することで、これを回避できます。

これは良いアプローチですが、そうであれば、このRegionBuilderThingに名前を付ける方法(他の人が理解できるように、いくつかのデザインパターン/ガイダンスに従う方法) これは良いアプローチではない場合は、何ですか?

+0

あなたは間違いなく参照*をどこかに追加する必要があります。あなたが 'ITicketEditorView'を持っていても、具体的な' TicketEditorView'にそれを解決するようにコンテナに指示する必要があります。その時点で参照が必要です。 – Jon

+0

はい、しかし、私はすべてのモジュールが参照を持つインフラストラクチャプロジェクトを持っています(一般的な型に使用されています)。 – mersadk

答えて

0

注入するViewModelを含む外部モジュールで、特定のEventAggregatorイベント(InjectChildEventなど)をサブスクライブするクラスを作成し、それをシングルトンとしてComponentContainerにロードします。 InjectChildEventはRegionNameをパラメータとして取ります。サブスクリプションメソッドで、ViewModelを解決してRegionに注入します。

メインモジュールで、ボタンをクリックすると、InjectChildEvent EventAggregatorイベントのインスタンスをパブリッシュします。

このようにして、他のモジュールへの参照をする必要がなくなります。インフラストラクチャプロジェクトでEventAggregatorイベントを作成する必要があります。

+0

これはmvvm/prismアプリケーションのコントローラと呼ばれています。詳細はこちらhttp://www.developmentalmadness.com/archive/2009/10/15/mvvm-with-prism-101-ndash-part-3b-view-injection-and.aspx – mersadk

1

理想的には、ビューではなくIRegionのViewsコレクションにViewModelを注入することをお勧めします。ロードされたResourceDictionaryにDataTemplateがあれば(App.xamlはそれと同じくらい良い)、ViewModelは適切なViewとしてレンダリングされます。このようにして、ViewModelコードをスクリーン上でレンダリングするために使用されているビューの知識から完全に分離することができます。

<DataTemplate DataType="{x:Type viewmodels:MyViewModel}"> 
    <views:MyView /> 
</DataTemplate> 

これ以外にも、私はRegionBuilderを必要としないと思います。

+0

OKですが、まだ私はモジュールプロジェクト(参照している私が避けようとしている)にあるそのビューモデルへの参照が必要です。 – mersadk

+0

他のモジュールへの参照を避けることについて本当に堅いなら、別の答えを追加しました。 –

関連する問題