0

アプリケーション内の新しいプロジェクトで MEF を使用しようとしています。物事はメインアプリレベルで機能しますが、アセンブリがメインアプリに含まれているこの別のプロジェクト(UserControl)では、何か疑問に思っています... UserControl があり、その中に次のものがあります:

  <UserControl.Resources>
      <DataTemplate DataType="{x:Type vm:MyViewModel}" >
          <local:MyView />
      </DataTemplate>
  </UserControl.Resources>
  <vm:MyViewModel />

私のMyViewModelでは、いくつかのものをエクスポートしましたが、アセンブリはうまく構成されているようです(これを確認するためにCompositionInfoTextFormatterを使用しています)。しかし、私の VM は MEF によってインスタンス化されていないか、少なくともコンストラクターが呼び出されません。そして、それが呼び出されると、MEF ではなく、WPF フレームワークからのものであるように見えます。

A) xaml で、VM をそのビューと MEF に関連付ける (上記と異なる場合)、および B) VM をインスタンス化して MEF が VM を制御し、エクスポートとインポートが機能するようにする正しい方法は何ですか?

現在、彼らはそうではありません。そのため、私はこれをすべて理解しようとしています:)

4

2 に答える 2

3

上記の内容を考えると、MEF はここではまったく関係ありません。完全に自己完結型の UserControl があります。

実際、表示している UserControl はもっと簡単に実行できます。

上で書いたこととほとんど同じです。MyView直接入力できるので、この UserControl が存在する理由はありません。


そうは言っても、個人的には DataTemplate の生成に MEF を使用しています。私がそれを処理する方法は、 をエクスポートするクラスがResourceDictionaryあり、メイン アプリケーションに をインポートさせResourceDictionary、それをメイン アプリケーション リソースとマージすることです。

このエクスポート クラスを使用して、各ビューから対応するビューモデルにマップする DataTemplate をエクスポートします。これは、どの VM からのビューについても知らなくても、完全な VM ファーストのアプローチを可能にするため、非常にうまく機能します。


編集:

[Import]MEF の代わりに WPF を構築に使用しているため、s が満たされていないことが問題のようです。この場合は、ここで入手できる PartInitializer クラスを使用することをお勧めします。詳細については、Glenn Block のブログを参照してください。

于 2010-02-11T19:05:00.820 に答える
0

WPF アプリケーション フレームワーク (WAF)のサンプル アプリケーションを見たことがあるかもしれません。これらは、MEF を使用して ViewModel クラスをインスタンス化する方法を示しています。

于 2010-07-30T19:03:54.660 に答える