2017-04-10 6 views
0

私のWPFアプリケーションにはMEFとMVVMパターンを使用する必要があります。MEFは自動的にオブジェクトを解決します

実は私はViewModelにそうdefiniedいる:VMの取得するための

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
class MainVM 
{   
    IServiceA serviceA;   
    IServiceB serviceB; 

    [ImportingConstructor] 
    public MainVM(IServiceA serviceA, IServiceB serviceB) 
    { 
     this.serviceA = serviceA; 
     this.serviceB = serviceB; 

     System.Diagnostics.Debug.WriteLine(serviceA.Time); 
    } 
} 

を、私はそう作られた、VMLocatorを利用します。

XAMLから呼び出さ
class ViewModelLocator 
{ 
    static ViewModelLocator instance; 

    public MainVM MainVM 
    { 
     get 
     { 
      MainVM output = MefBootstrap.Container.GetExportedValue<MainVM>(); 
      return output; 
     } 
    } 

    protected ViewModelLocator() 
    { 

    } 

    public static ViewModelLocator Instance 
    { 
     get 
     { 
      return instance ?? (instance = new ViewModelLocator()); 
     } 
    } 
} 

DataContext="{Binding Source={x:Static provider:ViewModelLocator.Instance}, Path=MainVM}" 

このコードは実際に動作します。実現が自動的にインポートVMが代わりにGetExportValue()メソッドを使用してのVMLocatorの属性宣言にのみMEF ExportAttribute [インポート]を使用している場合、私は不思議何

解決策はありますか?

+0

試しましたか?あなたは何をしたのですか? – wkl

+0

MainVMはまったく解決されていません。私は試しました [インポート]公開MainVM MainVM {get;セット; } –

答えて

1

手動でViewModelLocatorを作成したため、動作しません。手動で作成するので、IoC(MEF)はこのインスタンスの作成を制御できないため、コンテナからpropertyへの依存性(MainVM)の依存関係はありません。

そこで問題に対処するため、「任意の解決策はありますか?」:

HereはMVVMコンテキストでMEFを活用する方法の例です。

私はあなたにPRISMと行くことを強くお勧めします。それはすでにそれがあなたのために行われています。私はむしろ特にこの車輪を再発明したくないでしょう。

+0

私はPRISM + MEFソリューションを見ています。正直言って私は自分のやり方を維持したいのですが、ブートストラッピングに関わるロジックがあまりにも多いので –

+0

MEFソリューションでは、実際には新しいusercontrolを作成する "新しいビューモデルを作成し、それらを結合します。 – Karolis

+0

私はこの古いしかし良い解決策を使用しました。これはMEFと互換性があります。 https://wpftutorial.net/ReferenceArchitecture.html 唯一の悪い点は、コードの背後に少しのコードがあるとしますが、コンテナから解凍されていることです。 Hoveverでは、AppViewモジュールから呼び出されないため、他のビューを呼び出す方法はまだわかりません –

関連する問題