【问题标题】:How to force Visual Studio 2010 to ignore a WPF XAML declared DataContext at design time?如何强制 Visual Studio 2010 在设计时忽略 WPF XAML 声明的 DataContext?
【发布时间】:2026-01-27 07:40:01
【问题描述】:

我经常会使用声明性 DataContext 设置 WPF UserControl:

<UserControl...>
    <UserControl.DataContext>
        <local:SomeModel x:Name="Model" />
    </UserControl.DataContext>
</UserControl>

在设计模式下,Visual Studio 将尝试实例化 DataContext。但是,当 DataContext 从配置文件中提取数据时,Visual Studio 2010 会抛出如下错误:

无法创建实例 “某个模型”。

当错误被抛出时,设计时经验几乎没有价值。如果我注释掉 DataContext,那么 Visual Studio 2010 设计模式将按预期工作,没有 DataContext。

有没有办法让 Visual Studio 在设计时忽略 XAML 声明的 DataContext?

【问题讨论】:

  • 自 2010 年以来,您是否找到了一种纯 XAML 方法来执行此操作?
  • 没有纯粹的 XAML 方法;问题是设计者试图实例化模型。如果创建模型需要依赖关系,那么实例化就会失败。

标签: wpf xaml visual-studio-2010 design-time


【解决方案1】:

覆盖(或用“新”隐藏)您的数据上下文并使用 System.ComponentModel.DesignerProperties.GetIsInDesignMode() 返回适当的上下文。

为了获得奖励积分,请将您的条件分解包含在预处理器指令中和/或使用明智的 ConditionalAttribute() 以确保这种额外的噪音不会进入生产环境。

【讨论】:

  • 有人可以添加一个例子吗?
  • @SteveCar- 在 VM 构造函数中: if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) { return; }
【解决方案2】:

不确定我是否完全理解,但我使用此扩展方法来检测设计器何时运行我的代码:

public static class Extensions
{
    public static bool IsDesigner( this Process process )
    {
        if ( process.MainModule != null )
            return ( process.MainModule.ModuleName.Contains( "devenv.exe" ) );

        return false;
    }
}

【讨论】:

  • 扩展是一个很好的解决方法。我想暂时搁置这个问题,看看是否有人有纯 XAML 解决方法。谢谢!
  • 如果您的设计器不是 devenv.exe 怎么办?...例如 Blend 或其他 XAML 编辑工具。我认为下面的答案更安全。