Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VS Wpf设计器如何实例化和限制VIewModel代码的执行?_Wpf_Visual Studio_Designer - Fatal编程技术网

VS Wpf设计器如何实例化和限制VIewModel代码的执行?

VS Wpf设计器如何实例化和限制VIewModel代码的执行?,wpf,visual-studio,designer,Wpf,Visual Studio,Designer,WPF设计师有一项艰巨的工作要做。为了向您展示屏幕或组件的真实视图,它必须执行代码,但由于您不控制设计器,因此它必须在不产生任何副作用的情况下执行此操作 那么它是如何做到这一点的呢?执行的规则是什么 如果视图的代码隐藏代码不记录到文件或服务,该怎么办 如果代码隐藏调用MessageBox.Show,该怎么办 如果代码背后没有空的默认构造函数呢 我以前遇到过这样的情况,我拥有一个默认构造函数,该构造函数正在检查GetIsInDesignMode,如果为false,则创建并分配一个DataCont

WPF设计师有一项艰巨的工作要做。为了向您展示屏幕或组件的真实视图,它必须执行代码,但由于您不控制设计器,因此它必须在不产生任何副作用的情况下执行此操作

那么它是如何做到这一点的呢?执行的规则是什么

  • 如果视图的代码隐藏代码不记录到文件或服务,该怎么办
  • 如果代码隐藏调用
    MessageBox.Show
    ,该怎么办
  • 如果代码背后没有空的默认构造函数呢
  • 我以前遇到过这样的情况,我拥有一个默认构造函数,该构造函数正在检查
    GetIsInDesignMode
    ,如果为false,则创建并分配一个
    DataContext
    ,而仍然设计器没有正确渲染。是否存在某种堆栈深度限制

限制是什么?

这并不能完全回答您的问题,但老实说,“它是如何工作的”并不是一个非常具体的问题

但是,您是否知道可以向Xaml中添加类似的内容,而不是将此签入放到您的代码中

d:DataContext="{Binding Source={d:DesignInstance Type=namespace:className, IsDesignTimeCreatable=True}}"
这意味着您可以制作类的设计时版本,例如Calculator design:
ICalculator
,在Xaml中引用它,每次更改和编译设计时类时,视图都会在VS中更新,而不会运行任何代码或在代码背后有复杂的逻辑

它必须做到这一点而不产生任何副作用

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

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

关于你关于“堆叠深度限制”的问题,我知道没有这样的限制。如果你有一个不起作用的具体案例,我建议你问一个关于这个案例的具体问题


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

我知道,我正在使用它在设计时替换整个ViewModel,因为我在问题中提出了一些具体的问题,而这些问题都没有得到回答,我觉得这应该是一个评论,而不是一个答案,但我要指出的是,我会将问题改写为更直接的问题。