DataGrid Выбрать весь столбец - PullRequest
3 голосов
/ 30 января 2012

Я использую WPF DataGrid и хотел бы позволить пользователю выбрать весь столбец, щелкнув заголовок столбца. В настоящее время у меня для SelectionUnit установлено значение CellOrRowHeader, потому что я хочу, чтобы те же функции для строк (который прекрасно работает). Есть ли простой способ разрешить выбор столбцов, нажав на заголовок столбца?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

У вас есть много вариантов.Одним из них является создание собственного шаблона для стиля заголовка DataGrid.Внутри тега DataTemplate вы можете изменить шаблон заголовков.(Вы можете заменить кнопку на TextBlock или что угодно.)

<DataGrid>
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="DataGridColumnHeader" >
            <Setter Property="Foreground" Value="Blue" />
            <Setter Property="ContentTemplate" >
                <Setter.Value>
                    <DataTemplate>
                        <Button Content={Binding Content}" MouseDown="mouseDownEventHandler">
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.ColumnHeaderStyle>
</DataGrid>

или если вы используете DataGrid.Columns для заполнения ваших столбцов, и вам нужно установить каждый из них отдельно, вы можете использовать это:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn HeaderTemplate="{StaticResource MyTemplate1"/>
        <DataGridHyperlinkColumn HeaderTemplate="{StaticResource MyTemplate2"/>
    </DataGrid.Columns>
</DatGrid>

, где MyTemplate1 и 2 должны быть предварительно определены в ресурсах вашего элемента управления.


Редактировать:

Другой подход согласно этой ссылке - добавить PreviewMouseDown к вашей DataGrid, а затем выяснить, произошло ли нажатие мыши на заголовок или нет.

Это простая версия ее обработчика события:

DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridColumnHeader))
{
    dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null) return;
if (dep is DataGridColumnHeader)
{
    MessageBox.Show(((DataGridColumnHeader)dep).Content.ToString());
}
1 голос
/ 28 марта 2017

Вы также можете изменить ColumnHeaderStyle:

В XAML:

<DataGrid>
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <EventSetter Event="Click" Handler="DataGridColumnHeader_OnClick"></EventSetter>
        </Style>
    </DataGrid.ColumnHeaderStyle>
</DataGrid>

В коде позади:

private void DataGridColumnHeader_OnClick(object sender, RoutedEventArgs e)
{
    var columnHeader = sender as DataGridColumnHeader;
    if (columnHeader != null)
        {
        if (!Keyboard.IsKeyDown(Key.LeftCtrl))
        {
            dataGrid.SelectedCells.Clear();
        }

        foreach (var item in dataGrid.Items)
        {
            dataGrid.SelectedCells.Add(new DataGridCellInfo(item, columnHeader.Column));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...