2013-07-04 12 views
9

私はCaliburn.Microを使い始めました。Caliburn.Microは異なるアセンブリのViewとViewModelを一致させることはできません

ShellView(usercontrol)をTest.Appアセンブリに、ShellViewModelをTest.ViewModelアセンブリに配置して簡単なサンプルソリューションをブートストラップしようとしています。

「Caliburn.Test.ViewModel.ShellViewModelのビューが見つかりません」というテキストのウィンドウが表示されます。

しかし、ViewModelを.Appアセンブリに移動すると、完全に機能します。

namespace Caliburn.Micro.Test.ViewModel 
{ 
    public interface IShell 
    { 
    } 

    public class ShellViewModel : IShell 
    { 
    } 
} 
:これはCaliburn.Micro.Test.ViewModelアセンブリ内の私のViewModel(クラスライブラリ)である

namespace Caliburn.Micro.Test 
{ 
    public class AppBootstrapper : BootstrapperBase 
    { 
     SimpleContainer container; 

     public AppBootstrapper() 
     { 
      this.Start(); 
     } 

     protected override void Configure() 
     { 
      container = new SimpleContainer(); 

      this.container.Singleton<IWindowManager, WindowManager>(); 
      this.container.Singleton<IEventAggregator, EventAggregator>(); 
      this.container.PerRequest<IShell, ShellViewModel>(); 
     } 

     protected override object GetInstance(Type service, string key) 
     { 
      var instance = this.container.GetInstance(service, key); 
      if (instance != null) 
       return instance; 

      throw new InvalidOperationException("Could not locate any instances."); 
     } 

     protected override IEnumerable<object> GetAllInstances(Type service) 
     { 
      return this.container.GetAllInstances(service); 
     } 

     protected override void BuildUp(object instance) 
     { 
      this.container.BuildUp(instance); 
     } 

     protected override void OnStartup(object sender, System.Windows.StartupEventArgs e) 
     { 
      this.DisplayRootViewFor<IShell>(); 
     } 

     protected override IEnumerable<System.Reflection.Assembly> SelectAssemblies() 
     { 

      var assemblies = new List<Assembly>() 
      { 
       Assembly.GetExecutingAssembly(), 
       Assembly.Load("Caliburn.Micro.Test.ViewModel"), 
      }; 

      return assemblies; 
     } 
    } 
} 

:これはCaliburn.Micro.Testアセンブリ内Bootstraper(実行可能)である

私の問題を解決するのに手伝ってもらえますか? ありがとうございました! :D

+2

あなたは 'SelectAssemblies'をオーバーライドしましたか?ビューを含むすべてのアセンブリをCMに提供する必要があります – Charleh

答えて

20

ブートストラップでSelectAssembliesを無効にして、CM用アセンブリを選択したことを確認します。

ここでのドキュメントには、例があります。

http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper

protected override IEnumerable<Assembly> SelectAssemblies() 
{ 
    return new[] { 
     Assembly.GetExecutingAssembly() 
    }; 
} 

編集:

[OK]をあなたはどこを見れするCMを伝えるためにアセンブリを選択する必要がありますだけでなく、 - それはあなたのように聞こえますVMとビューが別々のライブラリにあるので、異なる名前空間にある可能性があります。どちらのライブラリでも同じルート名前空間を使用することができますが、標準のビュー解像度がうまくいくはずですが、ビューを解決しようとするアセンブリをCMに伝えるために、ブートストラップでアセンブリを選択しておく必要があります。

何らかの理由でビュー/ VMを別の名前空間に配置する場合は、CMがビューを解決するために使用するロジックをカスタマイズする必要があります。それは私が入門ドキュメント上に読んで示唆

(ビュー、最初のアプローチを使用している場合、またはその逆)のviewmodelの完全修飾型名に基づいてビューを見つけるために命名規則を使用しています。

http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

次にそれを実行してください。この記事 http://www.jerriepelser.com/blog/split-views-and-viewmodels-in-caliburn-micro/

EDIT

http://caliburnmicro.codeplex.com/wikipage?title=View%2fViewModel%20Naming%20Conventions&referringTitle=Documentation

http://caliburnmicro.codeplex.com/wikipage?title=Handling%20Custom%20Conventions&referringTitle=Documentation

+0

「CM」は何ですか?とにかく、ビューを検索する必要があるアセンブリーでは、ビューが同じブートストラップのアセンブリにあり、ViewModelsは別のビューにあります。 Anyqay、インポートの例を表示できますか?ありがとう! – Sergio

+1

ああ、私は誤って読んだので、あなたはvmsとは別のアセンブリでビューを持っているので、viewlocatorがデフォルトで見ることができないように追加の名前空間を検索するロジックを提供する必要があります。病気更新私の答え – Charleh

+0

そして私はCMを言うとき、私はカリバーンマイクロ:) – Charleh

6

解決感謝:あなたが命名規則に直接スキップしたい場合は、この特定のページをチェックアウト:返事を私のものと統合したので、受け入れられた答えをあなたのものに変えます。

+3

リンクが切れています。ドメイン名の有効期限が切れています。 :( –

+1

私はリンクを修正しました。http://www.jerriepelser.com/blog/the-killing-of-a-rockstar/を参照してください。 – wimh

関連する問題