2016-10-12 5 views
2

私はMVVM用のCaliburn Microを使用しています。今私は次のような状況に陥っています。私は最初のアセンブリでViewとViewModelを持つUserControlを持っていますassembly1namespace1です。同じ名前空間namespace1(それは同じ解決策にあります)を持つ2番目のアセンブリassembly2で使用すると、すべて正常に動作します。異なる名前空間を持つCaliburn Micro ViewLocator

今私は別のSolutionで私のViewModelをネームスペースnamespace3と使いたいと思います。私がこれを試しても、私はいつもエラーが表示され、そのビューは見つけられませんでした。

Ninjectを使用してブートストラップに手動でバインディングを設定する回避策を構築します。

protected override void Configure() 
{ 
    _kernel = new StandardKernel(); 
    _kernel.Bind<OverlayManagerView>().To<OverlayManagerView>().InSingletonScope(); 
    _kernel.Bind<OverlayManagerViewModel>().To<OverlayManagerViewModel>().InSingletonScope(); 
    base.Configure(); 
} 

protected override void OnStartup(object sender, System.Windows.StartupEventArgs e) 
{ 
    ViewModelBinder.Bind(IoC.Get<OverlayManagerViewModel>(), IoC.Get<OverlayManagerView>(), null); 
... 
} 

これは働いているが、私はassembly1からの私のviewmodelsを使用したい場合、私はいつも手動でシングルトンとしてバインドを設定しません。

Caliburn ViewLocatorに、ビューが異なる名前空間にある可能性があることを伝える方法はありますか?

私が働いていない、次の...

 ViewLocator.AddNamespaceMapping("namespace1", "namespace3"); 
     ViewLocator.AddNamespaceMapping("namespace1", "namespace1"); 
     ViewLocator.AddNamespaceMapping("namespace3", "namespace1"); 

たぶん誰かが解決策を知ってみました。あなたが使用する必要がありますあなたのConfigure方法で

答えて

2

ViewLocator.AddSubNamespaceMapping("ViewModelsNamespace", "ViewsNamespace"); 

、あなたは以下の方法オーバーライドすることがあります。カリバーンは新しいのdllを知ってもらうために

protected override IEnumerable<Assembly> SelectAssemblies() 
    { 

     var assemblies = new List<Assembly>(); 
     assemblies.AddRange(base.SelectAssemblies()); 
     //Load new ViewModels here 
     string[] fileEntries = Directory.GetFiles(Directory.GetCurrentDirectory()); 

     assemblies.AddRange(from fileName in fileEntries 
          where fileName.Contains("ViewModels.dll") 
          select Assembly.LoadFile(fileName)); 
     assemblies.AddRange(from fileName in fileEntries 
          where fileName.Contains("Views.dll") 
          select Assembly.LoadFile(fileName)); 
     return assemblies; 


    } 

を。

関連する問題