【问题标题】:How does the VS Wpf Designer instantiate and limit execution of VIewModel code?VS Wpf Designer 如何实例化和限制 VIewModel 代码的执行?
【发布时间】:2025-12-12 07:00:01
【问题描述】:

WPF 设计师的工作很艰巨。为了向您展示您的屏幕或组件的真实视图,它必须执行代码,但由于您无法控制设计器,因此它必须在不产生任何副作用的情况下执行此操作。

那么它是如何做到的呢?执行的规则是什么?

  • 如果视图的代码隐藏代码记录到文件或服务怎么办?
  • 如果代码隐藏调用MessageBox.Show怎么办?
  • 如果代码隐藏没有空的默认构造函数怎么办?
  • 我之前遇到过这样的情况,我一个默认构造函数,它检查GetIsInDesignMode,如果为假,则创建和分配DataContext,并且仍然是设计器没有正确渲染。是否存在某种堆栈深度限制?

有什么限制?

【问题讨论】:

    标签: wpf visual-studio designer


    【解决方案1】:

    这并不能完全回答您的问题,但老实说“它是如何工作的”并不是一个非常具体的问题。

    但是,您知道您可以将类似的内容添加到您的 Xaml 中,而不是将此检查放入您的代码隐藏中吗?

    d:DataContext="{Binding Source={d:DesignInstance Type=namespace:className, IsDesignTimeCreatable=True}}"
    

    这意味着您可以制作类的设计时版本,例如计算器设计: ICalculator,在 Xaml 中引用它,每次更改和编译设计时类时,视图都会在 VS 中更新,而无需运行任何代码或在代码隐藏中具有复杂的逻辑。

    【讨论】:

    • 我知道,并且我在设计时使用它来替换整个 ViewModel,因为我确实在问题中提出了一些具体问题,而这没有回答任何问题我觉得这应该是一个评论,而不是一个答案,但要点 - 我会重写这个问题更直接。
    【解决方案2】:

    它必须这样做而不产生任何副作用

    不,设计师没那么聪明。如果指定了IsDesignTimeCreatable,它将在公共无参数构造函数和绑定访问的属性中执行all 代码。具体来说,它会弹出消息框、写入文件等——或者尝试抛出异常(自己尝试一下)。

    如果您没有公共无参数构造函数,则无法创建实例,因此不会运行任何代码。

    关于您关于“堆栈深度限制”的问题,我知道没有这样的限制。如果您有一个无法正常工作的特定案例,我建议您针对该案例提出一个具体问题。

    在大多数情况下,设计器失败的原因是异常或其他与数据无关的问题(例如缺少设计时资源)。您绝对应该使用DesignerProperties.GetIsInDesignMode 保护您不想在设计时调用的代码(我通常将属性IsInDesignMode 添加到基本视图模型中)。

    【讨论】:

      最近更新 更多