假设您实际上Overview
在Views.Module
命名空间中有一个用户控件,CM 不会找到它
CM 将通过删除Model
原始 VM 命名空间/类型名称的一部分进行搜索。我不记得确切的规则,但你可以自定义它们
对于默认规则,正确的命名空间应该是Views.Model.Overview
您可能想查看名称转换的文档:
https://caliburnmicro.codeplex.com/wikipage?title=View%2fViewModel%20Naming%20Conventions&referringTitle=Documentation
还:
既然你已经调用了你的 VM ModelViewModel
,我只能冒险猜测 nametransformer 也可能会Model
从你的 VM 名称的开头剥离(尽管我认为正则表达式只检查字符串的结尾,所以你可能没问题!)
因此,假设上述命名空间更改不起作用,您最终可能会得到一个目标视图名称......我不知道是什么!
最后 - 可能值得实现一个调试记录器 - CM 针对日志接口写入大量信息,您只需要提供一种GetLog
提供实现的方法ILog
(写入Debug
流的方法通常足以进行故障排除)
您可以在Bootstrapper.Configure
(或任何其他足够早的地方)通过提供自己Func
的LogManager.GetLog
LogManager.GetLog = (type) => { return new DebugLogger(); };
并实施ILog
(DebugLogger
把那个留给你!)
编辑:尝试LocateForModel
在您的引导程序代码中重新实现 func:
ViewLocator.LocateForModel = (model, displayLocation, context) =>
{
var viewAware = model as IViewAware;
if (viewAware != null)
{
var view = viewAware.GetView(context) as UIElement;
if (view != null)
{
LogManager.GetLog(typeof(ViewLocator)).Info("Using cached view for {0}.", model);
return view;
}
}
return ViewLocator.LocateForModelType(model.GetType(), displayLocation, context);
};
然后您可以调试(这是我从 v1.4 的源代码中提取的内容,因此您可能需要再次查看源代码,因为 1.5 已经发布,具体取决于您使用的内容)
https://caliburnmicro.codeplex.com/SourceControl/changeset/view/ae616b841924#src/Caliburn.Micro.Silverlight/ViewLocator.cs
编辑:它也是 Silverlight 版本(我刚刚删除了一些编译器条件),所以你确实想从源代码中获取最新版本!