2013-07-04 45 views
9

我剛開始使用Caliburn.Micro。Caliburn.Micro無法與來自不同程序集的View和ViewModel相匹配

我想引導我簡單的示例解決方案將ShellView(usercontrol)放置在Test.App程序集和Test.ViewModel程序集中的ShellViewModel中。

我得到的是帶有以下文本的窗口:「無法找到Caliburn.Test.ViewModel.ShellViewModel的視圖」。

但是,如果我將ViewModel移動到.App程序集,它可以很好地工作。

這是Bootstraper在Caliburn.Micro.Test組件(可執行文件):

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.ViewModel裝配視圖模型(類庫):

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

    public class ShellViewModel : IShell 
    { 
    } 
} 

你能幫我解決我的問題嗎? 謝謝! :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() 
    }; 
} 

編輯:

好你不僅需要選擇組件告訴CM在哪裏看 - 這聽起來像你如果你的虛擬機和你的視圖可能在不同的命名空間中,因爲你在不同的庫中有它們。您可以在這兩個庫中使用相同的根名稱空間,並且標準視圖分辨率應該可以正常工作 - 但是,您需要確保已經在引導程序中選擇了程序集,以便告知CM哪些程序集嘗試解析視圖。

如果由於某種原因想要將視圖/虛擬機置於不同的名稱空間中,則需要自定義CM用於解析視圖的邏輯。它使用命名約定來定位基於視圖模型的完全限定類型名稱的視圖(或反之亦然,如果您使用的是視圖第一種方法)

我建議在入門文檔閱讀了:

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

然後按照它通過。如果您想直接跳到命名慣例,看看這個特定頁面:

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」表達什麼?無論如何,我讀過要做的組裝,它必須搜索視圖,但視圖是在Bootstrapper相同的大會,ViewModels在另一個。 AnyQay,你可以展示一個導入的例子嗎?謝謝! – Sergio

+1

啊我誤讀了,所以你有與vms不同的視圖,你需要爲viewlocator提供邏輯來搜索額外的命名空間,因爲默認情況下它不會看到它。生病更新我的答案 – Charleh

+0

當我說CM我的意思是Caliburn微:) – Charleh

相關問題