在DataGridColumnHeader单击事件中获取标头字符串

时间:2017-11-16 11:42:16

标签: c# wpf

我正在尝试添加DataGrid,其中单击列标题会导致对其下方的所有单元格执行操作。我可以在标题点击事件上设置一个事件处理程序。但由于标头绑定到VM中的字符串常量,因此它们的值似乎不会传递给事件处理程序。我无法在事件处理程序中的“sender”对象中的任何位置找到所单击标头的值。有什么想法吗?

以下是DataGrid的截图:

enter image description here

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());
    }
}

1 个答案:

答案 0 :(得分:1)

您必须先设置DataGridTemplateColumn.Header。您可以将标题文本绑定(从DataContext)设置为DataGridTemplateColumn.Header,并将TextBlock.Text绑定到相关的DataGridTemplateColumn.Header

目前您似乎正在设置DataGridTemplateColumn.HeaderTemplate并使用TextBlock查看标题,但您通过绑定而不是TextBlock.Text属性定向设置DataGridTemplateColumn.Header属性。因此,当用户点击您的列标题,并且您在代码中将“发件人”作为列标题时,其header.Content的默认值为null