2012-01-30 2 views
3

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

+0

Я возвращаюсь tly имел такую ​​же ситуацию и после нескольких часов поиска и абсолютно ничего не нашел, наконец, реализовал его с событием мыши и петлей! – Bijan

+0

Я думал, возможно, это можно сделать, переопределив стиль заголовка столбца, чтобы сделать его кнопкой, а затем добавив на эту кнопку событие щелчка. Я бы хотел, чтобы он выглядел так же, как стиль заголовка строки, но я новичок в стилизации. Может быть, если бы я мог понять, как выглядит стиль заголовка строки, я могу скопировать его и внести корректировки для заголовка столбца ... – KrisTrip

+0

переопределив, если вы имеете в виду классическое переопределение, то это не лучшее решение, когда у вас есть большой потенциал стилизации и шаблонов в WPF. Но ваша идея правильная и может работать, если вы переопределите стили Aero по умолчанию: http://stackoverflow.com/questions/643440/override-default-styling-in-wpf-textbox-based-on-presentationframework-aero однако если вы измените шаблон элемента управления, стили по умолчанию могут больше не работать. – Bijan

ответ

2

У вас есть много вариантов. один создает собственный шаблон для стиля заголовка 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 должны быть определены ранее в ресурсах вашего элемента управления.


Edit:

Другой подход, согласно this link является добавление 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()); 
} 
+0

Любая идея, как бы я выделил ее в синем на мыши, вроде заголовков строк? – KrisTrip

+0

Я искал его и нашел пару решений для получения события клика из заголовка столбца. один из них использует событие ColumnReordering, как описано здесь: http://stackoverflow.com/questions/3716819/wpf-listview-columnheader-click-event – Bijan

+0

Я изменил свой ответ выше. Взгляните на вторую часть (после «Изменить»). Я думаю, что это решит вашу проблему. – Bijan

1

Вы можете также изменить 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)); 
     } 
    } 
}