0

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

这就是我所拥有的:

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

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

我究竟做错了什么?我阅读了 CM 文档,似乎没问题...

提前致谢 !

4

1 回答 1

2

假设您实际上OverviewViews.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(或任何其他足够早的地方)通过提供自己FuncLogManager.GetLog

LogManager.GetLog = (type) => { return new DebugLogger(); };

并实施ILogDebugLogger把那个留给你!)

编辑:尝试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 版本(我刚刚删除了一些编译器条件),所以你确实想从源代码中获取最新版本!

于 2013-03-25T11:08:38.217 回答