VS Wpf Designer如何实例化并限制VIewModel代码的执行?

时间:2016-06-24 22:21:12

标签: wpf visual-studio designer

WPF设计师有一项艰巨的任务。为了向您展示您的屏幕或组件的生活视图,它必须执行代码,但是,由于您无法控制设计器,因此必须执行此操作而不会产生任何副作用。

那怎么做呢?有关执行的规则是什么?

  • 如果视图的代码隐藏代码记录到文件或服务怎么办?
  • 如果代码隐藏调用MessageBox.Show
  • 怎么办?
  • 如果代码隐藏没有空的默认构造函数怎么办?
  • 我遇到了 默认构造函数之前的情况,该构造函数正在检查GetIsInDesignMode并创建并指定DataContext如果为false,仍然设计师没有正确渲染。是否存在某种堆栈深度限制?

有什么限制?

2 个答案:

答案 0 :(得分:2)

  

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

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

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

关于"堆栈深度限制"的问题,我知道没有这样的限制。如果你有一个特定的案例,它不起作用,我建议你问一个关于这个案子的具体问题。

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

答案 1 :(得分:0)

这并不能完全回答你的问题,但说实话'它是如何运作的'并不是一个非常具体的问题。

然而,您是否知道可以在Xaml中添加这样的内容,而不是将此检查放入代码隐藏中?

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

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