如何强制 Visual Studio 2010 在设计时忽略 WPF XAML 声明的 DataContext?

发布于 2024-09-10 17:10:06 字数 559 浏览 6 评论 0原文

我经常使用声明性 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?

Quite often I will set up WPF UserControl with a declarative DataContext:

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

When in design mode, Visual Studio will attempt to instantiate the DataContext. However, when the DataContext is pulling data from a configuration file, Visual Studio 2010 will throw an error such as:

Cannot create an instance of
"SomeModel".

When the error is thrown, the design time experience is of little or no value. If I comment out the DataContext, then the Visual Studio 2010 design mode works as expected, sans DataContext.

Is there a way to have Visual Studio ignore the XAML declared DataContext at design time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

奢望 2024-09-17 17:10:06

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

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

Override (or hide with 'new') you data context and make use of System.ComponentModel.DesignerProperties.GetIsInDesignMode() to return the appropriate context.

For bonus points, wrap your conditional break up in pre-processor directives and/or make use of judicious ConditionalAttribute() to ensure this extra noise doesn't make it out into a production environment.

小鸟爱天空丶 2024-09-17 17:10:06

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

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

        return false;
    }
}

Not sure I understand completely, but I use this extension method to detect when the designer is running my code:

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

        return false;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文