【问题标题】:Unable to find view for viewmodel?无法找到视图模型的视图?
【发布时间】:2011-11-04 00:33:53
【问题描述】:

我正在尝试为一个小型网站制作合成 UI。

我的建筑树是这样的:

  • 外壳(Conductor.Collection.AllActive)
    • 包含多个 iPod(您可以将它们视为小部件)
    • 1 个 Pod 是一个 PagePod。

最后一个属于 IPodConductor,因此是包含 IPage(如 MainPage、ContactPage ..)的 Screen(pagepod)的组合

我的整个结构可以找到我所有的视图模型和遵循 Caliburns 约定的视图,但不是我的 MainPage。

错误如下: “找不到 Gymsport.Client.Pages.Main.MainPageViewModel 的视图”

我的视图结构如下: Gymsport.Client.Pages.Main.MainPageView

按照惯例,caliburn 应该能够找到我的视图……但它不能。

任何人都可以找出任何提示或调试此错误的指针。

提前致谢。

【问题讨论】:

  • 在与 Bootstrapper 相同的程序集中是否有 MainPageView?

标签: silverlight mvvm caliburn.micro convention


【解决方案1】:

在 C.M 中,有额外的逻辑用于查找与 Page 等单词相关的视图(请参阅 here)。

因此,您可以更改视图以匹配 C.M 中的规则,从视图模型中删除单词 Page,或者您可以使用类似的方式强制执行自定义简单视图位置:

ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) =>
{
    var viewTypeName = modelType.FullName.Substring(
        0,
        modelType.FullName.IndexOf("`") < 0
            ? modelType.FullName.Length
            : modelType.FullName.IndexOf("`")
        );

    viewTypeName = viewTypeName.Replace("Model", string.Empty);

    if (context != null)
    {
        viewTypeName = Regex.Replace(viewTypeName, "View$", string.Empty);
        viewTypeName += "." + context;
    }

    var viewType = (from assembly in AssemblySource.Instance
                    from type in assembly.GetExportedTypes()
                    where type.FullName == viewTypeName
                    select type).FirstOrDefault();

    return viewType;
};

【讨论】:

  • 太棒了,完全解决了我的问题。我在文档中找不到任何关于它的内容......我想我需要更多的直觉来吞噬源代码:) 非常感谢!
  • 看来只有将视图重命名为 Gymsport.Client.Pages.Main.MainPage 也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多