Caliburn.Micro 无法匹配来自不同程序集的 View 和 ViewModel
Posted
技术标签:
【中文标题】Caliburn.Micro 无法匹配来自不同程序集的 View 和 ViewModel【英文标题】:Caliburn.Micro can't match View and ViewModel from different assemblies 【发布时间】:2013-07-02 15:11:21 【问题描述】:我刚开始使用 Caliburn.Micro。
我正在尝试引导我的简单示例解决方案,将 ShellView(用户控件)放置在 Test.App 程序集中,将 ShellViewModel 放置在 Test.ViewModel 程序集中。
我得到的是一个带有以下文本的窗口:“找不到 Caliburn.Test.ViewModel.ShellViewModel 的视图”。
但如果我将 ViewModel 移动到 .App 程序集,它会完美运行。
这是 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 程序集(类库)中的 ViewModel:
namespace Caliburn.Micro.Test.ViewModel
public interface IShell
public class ShellViewModel : IShell
你能帮我解决我的问题吗? 谢谢! :D
【问题讨论】:
您是否覆盖了SelectAssemblies
?您需要向 CM 提供所有包含视图的程序集
【参考方案1】:
感谢这篇文章解决了 http://www.jerriepelser.com/blog/split-views-and-viewmodels-in-caliburn-micro/
编辑:由于您将您的回复与我的整合在一起,我将接受的答案更改为您的。
【讨论】:
链接已失效。域名已过期。 :( 我修复了链接,见jerriepelser.com/blog/the-killing-of-a-rockstar【参考方案2】:通过在引导程序中覆盖 SelectAssemblies
,检查您是否为 CM 选择了程序集。
这里的文档有一个例子:
http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper
protected override IEnumerable<Assembly> SelectAssemblies()
return new[]
Assembly.GetExecutingAssembly()
;
编辑:
好的,您不仅需要选择程序集来告诉 CM 去哪里查找 - 在您的情况下,您的虚拟机和视图可能位于不同的命名空间中,因为它们位于不同的库中。您可以在两个库中使用相同的根命名空间,并且标准视图解析应该可以正常工作 - 但是,您需要确保在引导程序中选择了程序集,以便告诉 CM 尝试解析视图的程序集。
如果您出于某种原因想要将视图/VM 放在不同的命名空间中,则需要自定义 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
【讨论】:
你对“CM”有什么看法?无论如何,我读到这是为必须搜索视图的程序集完成的,但视图在引导程序的同一个程序集中,视图模型在另一个程序集中。 Anyqay,你能展示一个导入的例子吗?谢谢! 啊,我看错了,所以您在与 vms 不同的程序集中有视图,您需要为视图定位器提供逻辑以搜索其他命名空间,因为默认情况下它不知道在那里查找。我会更新我的答案 当我说 CM 我的意思是 Caliburn Micro :) 好的,但我刚开始接触 CM,所以请你详细解释一下,我真的不知道什么 更新了我的答案-我建议先阅读一些内容,熟悉简单的东西真的不应该花费超过几个小时,而要熟悉其余的东西则需要几天时间以上是关于Caliburn.Micro 无法匹配来自不同程序集的 View 和 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章
Caliburn.Micro学习笔记----引导类和命名匹配规则
来自用户控制的 Caliburn.Micro 导航对 ShellViewModel