Caliburn Micro - 如何在单个视图模型上使用多个视图?

时间:2013-03-25 08:26:37

标签: wpf mvvm caliburn.micro

我正在尝试使用几个不同的视图来引用相同的视图模型,具体取决于上下文。

这就是我所拥有的:

  • ModuleViewModel.cs(包含“class ViewModels.ModuleViewModel”)
  • Model.Overview.xaml(包含“x:Class =”Views.Module.Overview“)

但是调用(我需要从我的实用程序库手动执行)到ViewLocator.LocateForModel(*viewModel*, null, "Overview")不会返回任何内容。

我做错了什么?我阅读了CM文档,看起来还不错......

提前致谢 !

1 个答案:

答案 0 :(得分:2)

假设您在Overview命名空间中实际拥有Views.Module个用户控件,CM将无法找到它

CM将通过删除原始VM名称空间/类型名称的Model部分进行搜索。我不记得确切的规则,但你可以自定义它们

对于默认规则,正确的命名空间应为Views.Model.Overview

您可能需要查看文档以进行名称转换:

https://caliburnmicro.codeplex.com/wikipage?title=View%2fViewModel%20Naming%20Conventions&referringTitle=Documentation

此外:

由于您已调用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已经取决于你使用的是什么)

https://caliburnmicro.codeplex.com/SourceControl/changeset/view/ae616b841924#src/Caliburn.Micro.Silverlight/ViewLocator.cs

编辑:它也是Silverlight版本(我刚刚删除了一些编译器条件),所以你确实想从源代码中获取最新版本!