VS Wpf设计器如何实例化和限制VIewModel代码的执行?
WPF设计师有一项艰巨的工作要做。为了向您展示屏幕或组件的真实视图,它必须执行代码,但由于您不控制设计器,因此它必须在不产生任何副作用的情况下执行此操作 那么它是如何做到这一点的呢?执行的规则是什么VS Wpf设计器如何实例化和限制VIewModel代码的执行?,wpf,visual-studio,designer,Wpf,Visual Studio,Designer,WPF设计师有一项艰巨的工作要做。为了向您展示屏幕或组件的真实视图,它必须执行代码,但由于您不控制设计器,因此它必须在不产生任何副作用的情况下执行此操作 那么它是如何做到这一点的呢?执行的规则是什么 如果视图的代码隐藏代码不记录到文件或服务,该怎么办 如果代码隐藏调用MessageBox.Show,该怎么办 如果代码背后没有空的默认构造函数呢 我以前遇到过这样的情况,我拥有一个默认构造函数,该构造函数正在检查GetIsInDesignMode,如果为false,则创建并分配一个DataCont
- 如果视图的代码隐藏代码不记录到文件或服务,该怎么办
- 如果代码隐藏调用
,该怎么办MessageBox.Show
- 如果代码背后没有空的默认构造函数呢
- 我以前遇到过这样的情况,我拥有一个默认构造函数,该构造函数正在检查
,如果为false,则创建并分配一个GetIsInDesignMode
,而仍然设计器没有正确渲染。是否存在某种堆栈深度限制DataContext
限制是什么?这并不能完全回答您的问题,但老实说,“它是如何工作的”并不是一个非常具体的问题 但是,您是否知道可以向Xaml中添加类似的内容,而不是将此签入放到您的代码中
d:DataContext="{Binding Source={d:DesignInstance Type=namespace:className, IsDesignTimeCreatable=True}}"
这意味着您可以制作类的设计时版本,例如Calculator design:
ICalculator
,在Xaml中引用它,每次更改和编译设计时类时,视图都会在VS中更新,而不会运行任何代码或在代码背后有复杂的逻辑
它必须做到这一点而不产生任何副作用
不,设计师没那么聪明。如果指定了isdesigntimecreateable
,它将在公共无参数构造函数和绑定访问的属性中执行all代码。具体来说,它会弹出消息框、写入文件等——或者抛出异常(自己试试)
如果您没有公共的无参数构造函数,它将无法创建实例,因此不会运行任何代码
关于你关于“堆叠深度限制”的问题,我知道没有这样的限制。如果你有一个不起作用的具体案例,我建议你问一个关于这个案例的具体问题
在大多数情况下,设计器失败是因为异常或其他与数据无关的问题(例如缺少设计时资源)。您应该使用
DesignerProperties.GetIsInDesignMode
(我通常会在基本视图模型中添加一个属性IsInDesignMode
)来保护不希望在设计时调用的代码。我知道,我正在使用它在设计时替换整个ViewModel,因为我在问题中提出了一些具体的问题,而这些问题都没有得到回答,我觉得这应该是一个评论,而不是一个答案,但我要指出的是,我会将问题改写为更直接的问题。