创建WPF DataGrid
时,我可以选择将DataTemplate
设置为每列的HeaderTemplate
,如下所示:
<DataGridTextColumn Binding="{Binding Name}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<!-- just some random content, not important, but notice the bindings use RelativeSource-->
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name" VerticalAlignment="Center"/>
<Button Command="{Binding Path=DataContext.SortFoldersByNameCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" Content="▲"
Foreground="{Binding Path=DataContext.IsFoldersSortByName, Converter={StaticResource EnabledToBrushConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
现在,请注意,要使绑定在该模板中工作,我需要设置一个RelativeSource
,因为该模板不再绑定到网格的DataContext
。
问题是:* * 什么绑定到头的DataTemplate
**?
例如,如果我简单地尝试输入一个<TextBlock Text="{Binding}"/>
,文本是空的,我不知道我还能做什么其他类型的测试来找出答案。
2条答案
按热度按时间rqqzpn5f1#
简短的回答是,数据上下文什么都不是。
我在磁盘上的一些数据网格中添加了一个快速模板。
几年前我用这个回答过几个问题。
标头不在可视化树中,并且不继承datacontext。
我的快速和肮脏的标题模板:
使用Snoop检查该文本块...
数据上下文为空:
这就是为什么你要做所有的相对源的事情来得到你在数据上下文中的属性。
顺便说一句。
如果您正在进行大量的wpf开发,我建议您给予一下Snoop。
它还是比内置的好得多。
lymnna712#
除了使用Snoop(很棒的工具!)之外,您还可以通过向绑定添加转换器并使用断点检查它来检查它。(如果绑定为null,则检查是必要的,这种情况就是如此)
Path=.
表示当前的DataContext
。其中,转换器定义为: