WPF DataGrid的HeaderTemplate默认绑定的对象是什么?
WPF DataGrid HeaderTemplate 默认绑定对象解析
问题说明
在WPF中配置DataGrid列的HeaderTemplate时,直接使用{Binding}会出现文本为空的情况,且必须通过RelativeSource绑定DataGrid的DataContext才能访问ViewModel中的命令或属性。疑问点在于:HeaderTemplate默认绑定的对象到底是什么?
用户提供的示例代码:
<DataGridTextColumn Binding="{Binding Name}"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <!-- 此处为示例内容,重点注意绑定使用了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>
核心解答
HeaderTemplate的默认DataContext是当前的列对象本身(比如示例中的DataGridTextColumn,或是其他DataGridColumn的派生类)。
验证方法
直接{Binding}显示为空,是因为这些列对象的默认ToString()方法返回空字符串或仅类名(无直观显示内容),可以通过以下方式验证绑定对象:
- 绑定列的
Header属性:如果给列设置了Header="Name",使用<TextBlock Text="{Binding Header}"/>会直接显示"Name",证明绑定的是列对象。 - 绑定列的固有属性:比如
<TextBlock Text="{Binding Width}"/>,会显示当前列的宽度值,进一步确认绑定目标。 - 显示绑定对象的类型:使用
<TextBlock Text="{Binding ., StringFormat='绑定对象类型: {0}'}"/>,会输出类似绑定对象类型: System.Windows.Controls.DataGridTextColumn的文本,直接看到绑定的对象类型。
为什么需要RelativeSource
列对象的DataContext和DataGrid的DataContext相互独立,列本身不会继承DataGrid的ViewModel上下文。因此要访问ViewModel中的命令或属性,必须通过RelativeSource向上查找DataGrid控件,再访问其DataContext。
内容的提问来源于stack exchange,提问作者Daniel Müller
相关产品推荐
相关产品推荐

