使用 Caliburn.Micro 视图模型优先方法时如何在设计器中显示内容控制?

2024-01-08

我在 WPF 应用程序中使用 ViewModel-first 方法使用 Caliburn.Micro (CM)。我正在用命令栏和活动项目组成主视图。主 viewModel 设置命令栏 viewModel 的属性,并正确导航到活动项目。

运行时一切看起来都很好,问题是only与设计时相关:主视图在设计器中显示为空,我找不到如何正确设置它。我设法让它在其他场景中工作,例如在设计时为整个 Window 或 UserControl 设置数据上下文时,即当它是 XAML 中的根 UI 元素时。但现在我无法对窗口中的子 ContentPresenter UI 元素执行此操作。

这是摘录主视图我正在作曲:

<Window x:Class="...MainView" ...>
  <DockPanel ...>
    <!-- this one binds to a property of type CommandBarViewModel -->
    <ContentControl x:Name="CommandBar" ... />
    <ContentControl x:Name="ActiveItem" ... />
  </DockPanel>
</Window>

我检查了一些相关的读物,但似乎没有一个适合/解决我的问题。这个问题 https://stackoverflow.com/questions/14536306/how-to-leverage-designer-when-using-a-viewmodel-first-approach-and-composition和我的基本一样,但是没有答案。这有一个参考这另一个问题 https://stackoverflow.com/questions/9107635/how-to-use-designinstance-with-caliburn-micro在我看来,这是一种视图优先的方法,从cal:View.Model绑定。

我尝试添加如下设计时上下文(fake为简洁起见,未显示命名空间):

<ContentControl x:Name="CommandBar" ... 
   d:DataContext="{d:DesignInstance Type=fake:DesignTimeCommandBarViewModel, IsDesignTimeCreatable=True}" 
   cal:Bind.AtDesignTime="True"/>

但后来我遇到了两种情况之一:

  • if 设计时间命令栏视图模型继承自实际命令栏视图模型,然后我遇到了设计时与依赖注入的常见问题:默认构造函数为所有注入的依赖项传递 null,而基本构造函数或其他东西会出现问题。我的意思是,似乎需要付出一些努力才能找到解决方法,并且just for设计时支持

  • if 设计时间命令栏视图模型不从实际的 viewModel 继承,那么似乎(正确地)CommandBarView 没有实例化,因为现在 viewModel 和该视图之间不再有任何关系。

你对此有什么想法吗?也许这应该通过托管 MainViewModel 的设计时版本来解决?

我查过的其他参考资料:这个答案来自 Rob Eisenberg 本人 https://stackoverflow.com/questions/9997226/caliburn-micro-getting-it-to-bind-usercontrols-in-a-mainview-to-their-viewmodels, 这个CM话题 http://caliburnmicro.codeplex.com/discussions/267231, 这另一个SO https://stackoverflow.com/questions/9580325/does-caliburn-micro-play-nicely-with-user-controls

Edit
按照我最后的(自动)提示,我还尝试创建并实例化一个设计时主视图模型, not继承自主视图模型,它公开相同的属性并设置设计时间命令栏视图模型在其默认构造函数中。在这种情况下,设计器显示了经典的 CM 抱怨,而不是命令栏:找不到 DesignTimeCommandBarViewModel 的视图。 下一步是什么?


好吧,这是我找到的解决方案:我很高兴听到更好的方法或其他建议。

Host MainViewXAML 指定一个指向主视图模型的设计时版本的设计时数据上下文,顺便说一句,not从运行时版本继承主视图模型. 内容控制项目保持不变。

<Window x:Class="...MainView" ...
  d:DataContext="{d:DesignInstance Type=fake:DesignTimeMainPanelViewModel, IsDesignTimeCreatable=True}"
  cal:Bind.AtDesignTime="True">

  <DockPanel ...>
    <ContentControl x:Name="CommandBar" ... />
    <ContentControl x:Name="ActiveItem" ... />
  </DockPanel>

</Window>

设计时间主面板视图模型具有相同的公共属性主面板视图模型,有一个没有依赖关系的默认 c'tor,并且它的 c'tor 设置命令栏属性到一个新实例设计时间命令栏视图模型:

public class DesignTimeMainPanelViewModel
{
    public DesignTimeMainPanelViewModel()
    {
        CommandBar = new DesignTimeCommandBarViewModel();
        ActiveItem = ...some instance here as well...;
    }

    public DesignTimeCommandBarViewModel CommandBar { get; private set; }
    public IScreen ActiveItem { get; private set; }
}

设计时间命令栏视图模型类用只有一个必需参数的自定义属性装饰,即系统类型与该视图模型关联的视图。

在引导期间,代码添加了一个新的视图定位器通过设置新的从视图模型类型获取视图类型的策略ViewLocator.LocateTypeForModelType.

如果标准定位器函数找不到视图类型,新的定位器函数将尝试查找视图类型。当然,它将在视图模型类型上查找自定义属性,如果找到,这将是返回的视图类型。要点如下:

Type viewType = _previousLocate(viewModelType, displayLocation, context);

if (viewType == null)
{
    FakeViewAttribute fakeViewAttr = Attribute.GetCustomAttribute(viewModelType, typeof(FakeViewAttribute)) as FakeViewAttribute;

    if (fakeViewAttr != null) viewType = fakeViewAttr.ViewType;
}

return viewType;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Caliburn.Micro 视图模型优先方法时如何在设计器中显示内容控制? 的相关文章

随机推荐

  • python 3.6 multiprocessing.Pool() 使用 Windows 启动非常慢

    在 Windows 10 AMD Threadripper 16 核 CPU 64 GB RAM 快速 SSD 上运行 Python 3 6 4 64 位 在我开始此测试之前 没有其他任何东西正在运行 任何修复 解决方法 想法或解释将不胜感
  • Django 模板 - 将字符串拆分为数组

    我有一个模型字段 它存储 URL 列表 是的 我知道 这是错误的方式 作为url1 nurl2 nurl3 lt gt 我需要在模板中将字段拆分为数组 因此我创建了自定义过滤器 register filter name split def
  • 如何从命令 Visual Studio Extension 2017 获取 IWpfTextView

    我需要使用 TextViewAdornment 显示弹出窗口 它需要 IWpfTextView 有旧代码 private IWpfTextView GetWpfTextView IVsTextView vTextView IWpfTextV
  • 如何在代理后面使用捆绑器?

    我从以下输出中得到须藤捆绑安装命令 Fetching source index for http rubygems org Could not reach rubygems repository http rubygems org Coul
  • 在 Matlab 中交换 x 和 y 轴

    这里可能是简单的 matlab 问题 但我已经搜索过但无法弄清楚如何做到这一点 I ve got a variables which plot like this 我只是希望 x 轴成为 y 轴 反之亦然 我该如何交换它们 预先感谢您的帮助
  • 使用 ASP.NET MVC 5 和 Bootstrap 3 默认安装时,为什么样式会出现 403 错误,而字体会抛出 404 错误?

    使用默认安装的 ASP NET MVC 5 和更新的 Bootstrap 3 加载我的项目主页不会显示 CSS 样式或包含的字体字形 404 文件未找到错误 CSS 样式在 Content css 地址处收到 403 禁止查看文件夹内容 错
  • Hibernate二级缓存<>

    我想在我的 hibernate 项目中使用二级缓存 但我只了解一点关于 hibernate 二级缓存的知识 任何人都可以解释我应该如何在我的代码中使用它以及我需要什么配置和 jar 文件吗 我将这些设置设置为 hibernate cfg x
  • Scala 任务返回映射

    我有一种方法 readHeader 接受一个参数并返回任务 列表 标题 另一个方法调用多个 id 并返回列表 任务 列表 设备标题 如何退货任务 列表 列表 标题 兼容多id读取功能 trait M1 def readHeader id S
  • 当元素启用/禁用时触发函数

    这似乎是一件相对简单的事情 但我在任何地方都找不到关于如何做到这一点的任何信息 我有一个模式 在等待异步数据时打开并禁用输入 我想知道该输入何时启用 以便我可以集中输入 这就是我正在努力实现的目标 将其视为全局模式打开处理程序 modal
  • C语言中当前的微秒时间?

    如何在 Unix 平台上用 C 打印当前微秒时间 在 Linux 和 BSD 中 您可以使用gettimeofday 功能 这填充了一个timevalstruct 它有一个自纪元以来的秒字段和一个微秒字段 该函数已被弃用 分辨率越高时钟获取
  • PyQt5 图像和 QGridlayout

    我有一个小部件 它想要显示图像QLabel and QCheckBox 创建了 4 个类 每个类都包含一些要放在最终屏幕上的信息 Class Grid对齐和网格图像 文本和复选框 脚本运行后获取当前屏幕 当前小部件中没有出现图像 图像在哪里
  • 为什么以下操作数不能一起广播?

    数组的维度如下 dists 500 5000 train 5000 test 500 为什么前两个语句会抛出错误 而第三个语句却可以正常工作 dists train test Error ValueError operands could
  • 如何测试一个点是否在二维整数坐标中的凸多边形内部?

    多边形以 Vector2I 对象列表的形式给出 二维 整数坐标 如何测试给定点是否在内部 我在网上找到的所有实现都因一些微不足道的反例而失败 编写正确的实现似乎确实很难 语言并不重要 因为我会自己移植 如果它是凸的 检查它的一个简单方法是该
  • 有没有办法挂钩 Webpack 的 AST 使其识别新的模块格式?

    简洁版本 我们如何操作最终输出包的 AST 以及加载器内部文件的 AST 在这两种情况下 我都想操作现有的 AST 而不是解析源代码并创建新的 AST 我正在做的事情很慢 而且我知道 Webpack 一定已经做了 AST 所以我想避免重复工
  • PendingIntent 不适用于 Android O

    我的应用程序中有下载通知 我添加了 取消 按钮NotificationCompat Builder通过致电addAction 方法 但按钮在 Android O 设备上不起作用 当我按 取消 按钮时 什么也没有发生 但按钮在 Android
  • 在 Hive 中将字符串转换为时间戳

    我有一个值 2017 09 27T19 25 15 927 07 00 有什么方法可以将其转换为时间戳吗 我使用 Hive 1 1 0 select unix timestamp 2017 09 27T19 25 15 927 07 00
  • 使用 HaskellDB 取消映射表记录的基本示例

    假设我有以下 PostgreSQL 表定义 CREATE TABLE books id serial NOT NULL title character varying NOT NULL PRIMARY KEY id 以及以下记录定义 dat
  • jquery wcf 肥皂调用失败

    有人知道我可以对 wcf 服务进行 jquerysoap 调用吗 我的 JQuery 代码 ajax url http localhost oseop orderingservice svc HelloWorld data txtTestR
  • Android 上的 Facebook 集成 fbconnect 断开的链接

    我正在尝试将 Facebook 集成到我的 Android 应用程序中 它可以正常登录 Facebook 但当它尝试将访问令牌传递回应用程序时 它只会返回 网页位于 fbconnect success access token 访问令牌 可
  • 使用 Caliburn.Micro 视图模型优先方法时如何在设计器中显示内容控制?

    我在 WPF 应用程序中使用 ViewModel first 方法使用 Caliburn Micro CM 我正在用命令栏和活动项目组成主视图 主 viewModel 设置命令栏 viewModel 的属性 并正确导航到活动项目 运行时一切