让Caliburn.Micro将我的View和VM绑定到与Windsor的单独程序集中

Mar*_*k W 3 c# wpf castle-windsor mvvm caliburn.micro

我在这里使用Caliburn.Micro bootstrapper:

https://gist.github.com/1127914

如果我将所有视图和视图模型保留在与bootstratpper相同的项目中,则一切正常.

但我想将Views和ViewModels文件夹推送到另一个程序集/项目,我这样做,更改名称空间,更新引导程序以找到该viewmodel.现在,当我跑步时,我得到了错误

"没有找到支持MVVMBook.ViewModules.ViewModels.MainViewModel服务的组件"

在这部分引导程序上:

return string.IsNullOrWhiteSpace(key)
               ? _container.Resolve(service)
               : _container.Resolve(key, service);
Run Code Online (Sandbox Code Playgroud)

显然它无法连接ViewModel,即使VM被设置为Bootstrapper的通用参数:

 public class CastleBootstrapper : Bootstrapper<MainViewModel>
Run Code Online (Sandbox Code Playgroud)

我正在使用的命名约定是一个名为Views的文件夹和一个名为ViewModels的文件夹,文件是MainView.xaml和MainViewModel.cs

我在哪里可以告诉它看这个集会?

还将此块添加到引导程序中,因为当视图和视图模型位于单独的程序集中但未解决此问题时,建议使用此块:

// needed if views and viewmodels are in a seperate assembly
  protected override IEnumerable<Assembly> SelectAssemblies()
  {
     return new[]
               {
                  Assembly.GetExecutingAssembly()
               };
  }
Run Code Online (Sandbox Code Playgroud)

Pet*_*jic 6

找不到您的ViewModel,因为它未注册.引导程序附带的ApplicationContainer类有一个RegisterViewModels方法,如下所示:

private void RegisterViewModels()
{
    Register(AllTypes.FromAssembly(GetType().Assembly)
                    .Where(x => x.Name.EndsWith("ViewModel"))
                    .Configure(x => x.LifeStyle.Is(LifestyleType.Transient)));
}
Run Code Online (Sandbox Code Playgroud)

这仅在ApplicationContainer所在的程序集中注册ViewModel.

我想你在项目中粘贴了这些类,所以你可以修改它们.如果是这种情况,您可以修改应用程序容器RegisterViewModels或修改CastleBootstrapper并覆盖Configure()方法,如下所示:

protected override void Configure()
{
     _container = new ApplicationContainer();
     _container.AddFacility<TypedFactoryFacility>();
     _container.Register(AllTypes.FromAssembly(typeof(MainViewModel).Assembly)
         .Where(x => x.Name.EndsWith("ViewModel") || x.Name.EndsWith("View"))
         .Configure(x => x.LifeStyle.Is(LifestyleType.Transient)));
}
Run Code Online (Sandbox Code Playgroud)

以上将注册所有视图模型和视图.要使Caliburn正确定位视图,请更新SelectAssemblies()方法:

protected override IEnumerable<Assembly> SelectAssemblies()
{
   return new[]
   {
       Assembly.GetExecutingAssembly(),
       typeof(MainViewModel).Assembly
   };
}
Run Code Online (Sandbox Code Playgroud)

有关Castle.Windsor的更多信息,请访问 http://stw.castleproject.org/Windsor.MainPage.ashx