5

私は次の設定をしています:

  • xaps/モジュールに分割された Silverlight アプリ
  • MEF を DI フレームワークとして使用して、アプリケーションのさまざまな部分を接続します。

  • 私は2つの地域を持っています:

  • 1 つ (左のもの) には、リスト ビュー (例: 顧客) が取り込まれます。

  • 1 つ (右のもの) には、領域を持つタブ コントロールを含む別のビューを (選択した顧客に応じて) 領域を持つタブ コントロールを含むビューが取り込まれます。

    右側の結果: ここに画像の説明を入力

最初のレベルのタブコントロールを設定するために、「顧客変更イベント」をリッスンしています-(これはうまく機能します)。イベントを受信すると、最初のレベルのタブ領域にビューを設定します:

    Dim lReg As IRegion = Me.mRegionManager.Regions("FirstLevelTabReqion")
    Dim lViewID As String = CommonDefinitions.Constants.BuildFirstLevelViewName(lUniqueID)
    Dim lFirstLevelView FirstLevelView = TryCast(lReg.GetView(lRqViewID), FirstLevelView)
    If lFirstLevelView Is Nothing Then     
         lFirstLevelView = New FirstLevelView()
         Dim lRegMan1 As IRegionManager = lReg.Add(lFirstLevelView, lViewID, True)
         lFirstLevelView.SetRegionManager(lRegMan1)
         ...
    End If

注: FirstLevelView を作成するときは、FirstLevelView がCompositionInitializer.SatisfyImportsその ViewModel 参照を解決することを確認するために、呼び出しをスローする必要があります。

SecondLevel ViewModel で EventsAggregator のインスタンスを取得するには、次を使用します。

  <ImportingConstructor()>
  Public Sub New(ByVal iEvAggregator As IEventAggregator)
          EventAggregator = iEvAggregator
          EventAggregator.GetEvent(Of DoStuffSecondLevel).Subscribe(AddressOf OnDoStuffSecondLevel, True)

   End Sub

私の問題は、第 2 レベルのビュー モデルで取得した EventAggregator インスタンスが第 1 レベルの EventAggregator インスタンスと異なるため、第 1 レベルで DoStuffSecondLevel を公開すると、第 2 レベルでキャッチされないことです。

EventAggregator の 2 つの異なるインスタンスを取得するのはなぜですか?
アプリケーション全体で EventAggregator の同じインスタンスを共有するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

3

問題は、MefBootstrapper がコンテナを作成するが、それを DEFAULT コンテナとして登録しないことです。SatisfyImports が呼び出されると、MEF はコンテナーを認識しないため、新しいコンテナーを作成します。2 つの異なるコンテナーが作成されているため、インスタンスが異なるのはそのためです。これを解決するには、Prism Container を MEF が使用する既定のコンテナーとして設定するだけです。

Silverlight ソリューション (ブートストラップ):

protected override void InitializeShell()
{
    base.InitializeShell();

    //Make the container the default one.
    CompositionHost.Initialize(this.Container);

    //Etc.
}

WPF (デスクトップ) ソリューション:

現在、デスクトップ ソリューションを機能させることができません。問題は、MEFExportFactory<T>ComponentInitializerが Silverlight アプリでしか利用できないことです (なぜ!?)。Glen Block は、ライブラリのデスクトップ バージョンにアクセスできるライブラリを作成しましたSystem.ComponentModel.Composition.Initialization.dll。私はそれを使用しようとしましたが、コードではコンテナーが既に存在する場合に失敗するように設定されているため、失敗しました...もう一度、なぜですか? このソリューションで MEF2 (Codeplex プレビュー) を使用することはまだ試していませんが、(おそらく) うまくいくと思います。煩わしい部分は、MEF2 (Codeplex) を使用することを選択した場合、Prism バイナリを再構築し、.NET 4 MEF ライブラリのすべての参照を Codeplex MEF2 ライブラリに置き換える必要があることです。これにより、Prism は文句を言わずに Codeplex MEF2 ライブラリを操作できるようになります。これにより、このソリューションが WPF で実行可能になるかどうかを確認します。

于 2011-07-06T18:03:48.793 に答える