.net - 为什么设计时数据上下文属性不会传播到用户控件?
问题描述
我有一个控件,我为其设置了设计时上下文:
<UserControl x:Class="My.Namespace.OuterControl"
xmlns:local="My.Namespace"
d:DataContext="{d:DesignInstance Type=local:Sample, IsDesignTimeCreatable=True}">
<StackPanel>
<!-- This is the version that actually matters -->
<local:InnerControl Title="{Binding OuterTitle}"/>
<!-- Alternate versions for comparison purposes -->
<local:InnerControl Title="Sample Title 2"/>
<local:InnerControl Title="{Binding OuterTitle}" d:Title="Sample Title 3"/>
<TextBlock Text="{Binding OuterTitle}"/>
</StackPanel>
</UserControl>
显然,这已经删除了大部分细节和不重要的属性。重要的是上下文类型有一些属性,我们称之为OuterTitle
,而内部控件有一个依赖属性,我称之为Title
。
问题是:第一个实例InnerControl.Title
在设计时没有绑定,这是我实际需要使用的公式。其他的用于比较目的。没有错误,也没有任何迹象表明它为什么不起作用,它只是表现得好像绑定根本不存在。
我认为这应该起作用的原因是:
- 第二个和第三个
InnerControl
标签(带有硬编码Title
或d:Title
)都显示了正确的标题,这证明依赖属性设置正确。 TextBlock
绑定到同一个属性的那个OuterTitle
也显示了正确的标题,这证明了{Binding OuterTitle}
表达式确实在工作并且外部控件的数据上下文是一个有效的实例。
它InnerControl
本身使用数据绑定来显示值Title
- 但是,我已经确认这不是原因,因为如果我将属性的实现更改为使用代码隐藏,我会得到相同的结果。这表明InnerControl
实际上从未真正收到正确的值,尽管事实上相同的表达式在 a 中有效TextBlock
。
有谁知道这里的神奇成分是什么导致第一个InnerControl.Title
没有出现在设计器中?是否有解决方法?
PS请理解这是一个缩小的例子来澄清问题。实际实例显然要复杂得多,因此“d:Title
为每个InnerControl
人指定”的建议不会有帮助,因为这个问题会影响整个设计器树。
解决方案
推荐阅读
- sql-server - 无法从 SQL Server 代理运行 SQL Server SSIS 包
- listview - Flutter 小部件动态地放在其余部件之上
- node.js - react-native node 依赖安装破坏项目
- r - 将字符串转换为数字时出错
- html - Powershell 服务状态 || HTML 输出
- xcode - 为什么 Xcode 10 会崩溃?
- android - 在 NDK for Android 上编译 stressapptest
- vba - VBA - 将数据从一个工作簿推送到另一个工作簿,而不考虑文件名
- githooks - gitolite 设置解决了什么问题?
- c# - 计算组中列的变化并根据标准进行提取