我正在尝试添加DataGrid,其中单击列标题会导致对其下方的所有单元格执行操作。我可以在标题点击事件上设置一个事件处理程序。但由于标头绑定到VM中的字符串常量,因此它们的值似乎不会传递给事件处理程序。我无法在事件处理程序中的“sender”对象中的任何位置找到所单击标头的值。有什么想法吗?
以下是DataGrid的截图:
XAML:
<DataGrid Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Path=InfoFieldCollection, Mode=TwoWay}"
AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Resources>
<Style TargetType="DataGrid">
<EventSetter Event="SelectionChanged" Handler="RovIllustrationInfoFieldDataGrid_SelectionChanged" />
</Style>
<Style TargetType="DataGridCell">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0" />
</Style>
<Style TargetType="DataGridColumnHeader">
<EventSetter Event="Click" Handler="RovIllustrationInfoFieldDataGridColumnHeader_Click" />
</Style>
</DataGrid.Resources>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow},
Converter={StaticResource DataGridRowToHeaderStringConverter}}" />
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataContext.InfoFieldIsVisibleLabel, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsVisible, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
C#:
private void RovIllustrationInfoFieldDataGridColumnHeader_Click(object sender, RoutedEventArgs e) {
var header = sender as DataGridColumnHeader;
var vm = DataContext as ElementDetailsUserControlVM;
if (header != null && vm != null) {
Console.WriteLine(header.Content.ToString());
}
}
答案 0 :(得分:1)
您必须先设置DataGridTemplateColumn.Header
。您可以将标题文本绑定(从DataContext)设置为DataGridTemplateColumn.Header
,并将TextBlock.Text
绑定到相关的DataGridTemplateColumn.Header
。
目前您似乎正在设置DataGridTemplateColumn.HeaderTemplate
并使用TextBlock
查看标题,但您通过绑定而不是TextBlock.Text
属性定向设置DataGridTemplateColumn.Header
属性。因此,当用户点击您的列标题,并且您在代码中将“发件人”作为列标题时,其header.Content
的默认值为null
。