c# - 为什么我的 DataContext 会从我下面切换出来进行绑定?
问题描述
我正在尝试使用PropertyToolsPropertyGrid
中的组件来显示对象的信息。我可以很容易地绑定对象——它是我的 DataContext 上的一个属性——但是不能从对象派生的东西之一是应该显示在选项卡标题中的名称。(而且我无法更改它;我正在检查的对象来自第三方。)正确的名称是我的 DataContext 上的不同属性。
PropertyGrid
DataTemplate
有一种方法可以通过将 a 传递给其TabHeaderTemplate
属性来更改选项卡标题的显示方式。但是模板内部发生了一些奇怪的事情:我的 DataContext 不见了,取而代之的是别的东西。当我尝试{Binding TabName}
在上下文中的适当位置说时,它会出错并告诉我这TabName
不是 class 上的有效属性Tab
。但是我的DataContext
课没有被调用Tab
;这是 PropertyTools 代码库中的内容!
我还是 WPF 的新手,所以我不知道这里发生了什么。为什么在这个模板中从我下方提取的 XAML 文件的其余部分中完全有效的范围内 DataContext 是完全有效的,我该如何修复它?
编辑:按要求发布 XAML。模板实际上只是最简单的事情:
<UserControl.Resources>
<DataTemplate x:Key="HeaderTemplate">
<TextBlock Text="{Binding TabName}" />
</DataTemplate>
</UserControl.Resources>
然后在页面的下方,
<props:PropertyGrid
SelectedObject="{Binding Value}"
TabHeaderTemplate="{StaticResource HeaderTemplate}" />
但是出于某种奇怪的原因,在模板中它试图解释错误 DataContext 中的绑定!
解决方案
在这种情况下,只需确保在绑定中指定源即可。有几种方法可以做到这一点。一种是使用RelativeSource
Binding的属性。另一种是使用ElementName
给你的 UserControl 这个属性:
x:Name="Root".
然后更改您的绑定以使用它
<TextBlock Text="{Binding ElementName=Root, Path=DataContext.TabName}" />
或者使用这个:
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}, Path=DataContext.TabName}"/>
推荐阅读
- flutter - 如何在视频播放器 Flutter 中显示缺口
- java - 在错误的 IDE 下保存文件
- flutter - 通过按下按钮在运行时更改所有应用程序小部件的持久颜色
- postgresql - 如果交叉连接表中没有匹配字段,我可以参考 jsonb 表中的数据吗
- haskell - 为 GHC.TypeLits.Nat 编写 AbsDiff
- memory - pyspark中的函数调用后,函数中创建的数据帧的内存是否会被释放
- jupyter-lab - Jupyter-lab:ServerApp 实例的“min_open_files_limit”特征需要一个 int,而不是 NoneType None
- python - 当表达式为假时,while循环不会停止循环
- winapi - 如何在报告模式下将 ImageList 中的 PNG 透明图像用于 ListView 控件,为什么会得到我得到的结果?
- asp.net - 解析器错误消息:无法加载类型“xxxx.Global”