在编辑界面代码时,我发现一行代码:

XML
d:DataContext="{d:DesignInstance Type={x:Type localVM:EmbossingActionConfigPageViewModel},
IsDesignTimeCreatable=False}"
关于其中的DataContext的指定逻辑让我很疑惑。
因为我在C#代码中也指定了DataContext,给我的感觉就是这里的d:DataContext=...并没有起作用,以下是学习到的知识点:
各部分含义:
-
d:命名空间- 这是设计时命名空间,通常定义为:
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- 只在设计时生效,运行时会被忽略
-
d:DataContext-
仅为设计器设置数据上下文
-
不会影响运行时的实际DataContext
-
-
d:DesignInstance- 一个特殊的标记扩展,创建设计时实例
-
Type={x:Type localVM:EmbossingActionConfigPageViewModel}-
指定要使用的ViewModel类型
-
localVM是ViewModel的命名空间前缀
-
-
IsDesignTimeCreatable=False-
重要参数!表示不真正创建ViewModel实例
-
只使用类型元数据提供智能感知
-
实际作用
1. 提供智能感知
<!-- 在设计器中,你可以这样绑定: -->
<TextBox Text="{Binding ViewModelProperty}" />
<!-- ↑ 输入时会有ViewModel属性的智能感知提示 -->
2. 设计时预览
<!-- 如果 IsDesignTimeCreatable=True -->
d:DataContext="{d:DesignInstance Type=localVM:MyViewModel,
IsDesignTimeCreatable=True}"
会实际创建ViewModel实例,可以:
-
预览真实数据
-
看到控件样式
-
测试布局
3. 与运行时DataContext的关系
<!-- 典型用法 -->
<UserControl
x:Class="MyView"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d:DataContext="{d:DesignInstance Type=localVM:MyViewModel,
IsDesignTimeCreatable=False}"
DataContext="{Binding MyViewModel, Source={StaticResource Locator}}">
<!--
设计时:使用d:DataContext获取智能感知
运行时:使用实际的DataContext绑定
-->
</UserControl>