2010-07-21 36 views
0

很多时候我会成立WPF用户控件与声明的DataContext:如何强制Visual Studio 2010在设计时忽略WPF XAML声明的DataContext?

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

当在设计模式中,Visual Studio将尝试实例化的DataContext。然而,当在DataContext从配置文件中提取数据时,Visual Studio 2010将抛出一个错误,如:

无法创建 “SomeModel”的实例。

当引发错误时,设计时体验很少或没有价值。如果我将DataContext注释掉,那么Visual Studio 2010设计模式按预期工作,无法使用DataContext。

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

+0

自2010年以来,您是否找到了一种纯XAML方式来执行此操作? – Olwaro 2013-01-16 15:26:04

+0

没有纯粹的XAML方法;问题在于设计师正试图实例化模型。如果有创建模型需要依赖关系,那么实例化将失败。 – 2013-01-16 15:34:03

回答

1

不知道我完全理解,但我用这个扩展方法,当设计师运行我的代码来检测:

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

     return false; 
    } 
} 
+0

该扩展是一个很好的解决方法。我想将问题留待一段时间,看看是否有人有纯粹的XAML解决方法。谢谢! – 2010-07-21 23:38:14

+0

如果你的设计者不是devenv.exe?...比如Blend或其他XAML编辑工具。我认为下面的答案更安全。 – 2011-02-15 15:45:52

4

覆盖(或“新”隐藏),你的数据上下文和利用系统的.ComponentModel.DesignerProperties.GetIsInDesignMode()返回适当的上下文。

对于奖励积分,在预处理器指令中包装您的条件分解和/或利用审慎的ConditionalAttribute()来确保这些额外的噪音无法使其进入生产环境。

+0

有人可以请添加一个这样的例子吗? – SteveCav 2011-03-08 23:47:06

+0

@ SteveCar-在VM构造函数中:if(DesignerProperties.GetIsInDesignMode(new DependencyObject())) { return; } – RichardOD 2012-05-12 19:40:50