我正在尝试使用几个不同的视图来引用相同的视图模型,具体取决于上下文。
这就是我所拥有的:
但是调用(我需要从我的实用程序库手动执行)到ViewLocator.LocateForModel(*viewModel*, null, "Overview")
不会返回任何内容。
我做错了什么?我阅读了CM文档,看起来还不错......
提前致谢 !
答案 0 :(得分:2)
假设您在Overview
命名空间中实际拥有Views.Module
个用户控件,CM将无法找到它
CM将通过删除原始VM名称空间/类型名称的Model
部分进行搜索。我不记得确切的规则,但你可以自定义它们
对于默认规则,正确的命名空间应为Views.Model.Overview
您可能需要查看文档以进行名称转换:
此外:
由于您已调用VM ModelViewModel
,我只能猜测名称转换器可能会从VM名称的开头剥离Model
(尽管我认为正则表达式只检查字符串的结尾,这样你就可以了!)
因此假设上述命名空间更改不起作用,您最终可能会得到目标视图名称...我不知道是什么!
最后 - 可能值得实现一个调试记录器--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已经取决于你使用的是什么)
编辑:它也是Silverlight版本(我刚刚删除了一些编译器条件),所以你确实想从源代码中获取最新版本!