2012-02-29 2 views
6

Я использую сетку данных WPF. У пользователя сети данных есть заголовки столбцов и заголовки строк.Событие для выбора всех: WPF Datagrid

Когда видны столбцы и заголовки строк, в левом верхнем углу имеется одна маленькая квадратная секция. (поперечное сечение в верхнем левом углу, где встречаются заголовки столбцов и строк). Когда мы нажимаем на него, он выбирает все ячейки в сетке данных. Есть ли какое-то событие для этого? Если нет, то как это может ловушка. Пожалуйста, направляйте меня.

Дайте мне знать, если вам нужна какая-либо другая информация по этой проблеме.

С уважением, Priyank

ответ

12

Datagrid обрабатывает маршрутизированную команду ApplicationCommand.SelectAll, поэтому, если сетка имеет фокус, а нажмите Ctrl-A, или вы нажимаете кнопку угла, выбираются все ячейки. Вы можете обрабатывать эту команду самостоятельно, добавив CommandBinding в XAML:

<DataGrid x:Name="dataGrid" .../> 
    <DataGrid.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.SelectAll" Executed="SelectAll_Executed"/> 
    </DataGrid.CommandBindings> 

Или вы можете добавить команду связывания в коде:

public MyControl(){ 
    InitializeComponent(); 
    ... 
    dataGrid.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, SelectAll_Executed)); 
} 

Однако, может быть только один обработчик для маршрутизации поэтому по умолчанию добавление этого обработчика предотвратит выбор всех из работы в datagrid. В вашем обработчике вам необходимо позвонить SelectAll.

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    Debug.WriteLine("Executed"); 
    dataGrid.SelectAll(); 
} 
0

Это не совсем хорошее решение, но вы можете обработать событие как «SelectionChanged» и проверить, если количество выбранных элементов равно количеству элементов в источнике данных

0

Я предпочитаю, чтобы избежать использования кода позади в представлениях, так что я сделал это так: enter image description here

enter image description here

Это CheckBox в левом верхнем углу, что выбрать/снять все ,

Раствор построены из 2-х частей: Присоединенные свойства и особенно структура XAML:

1). Прикрепленные свойства:

public class DataGridSelectAllBehavior 
{ 
    public static bool GetValue(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(ValueProperty); 
    } 

    public static void SetValue(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ValueProperty, value); 
    } 
    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.RegisterAttached("Value", typeof(bool), typeof(DataGridSelectAllBehavior), new PropertyMetadata(false, 
      (o, e) => 
      { 
       var dg = DataGridSelectAllBehavior.GetDataGrid(o); 
       CheckBox checkBox = o as CheckBox; 

       if (checkBox.IsChecked == true) 
       { 
        dg.SelectAll(); 
       } 
       else 
       { 
        dg.UnselectAll(); 
       } 

      })); 


    public static DataGrid GetDataGrid(DependencyObject obj) 
    { 
     return (DataGrid)obj.GetValue(DataGridProperty); 
    } 

    public static void SetDataGrid(DependencyObject obj, DataGrid value) 
    { 
     obj.SetValue(DataGridProperty, value); 
    } 

    public static readonly DependencyProperty DataGridProperty = 
     DependencyProperty.RegisterAttached("DataGrid", typeof(DataGrid), typeof(DataGridSelectAllBehavior), new PropertyMetadata(null)); 

} 

2) XAML:

<DataGrid ItemsSource="{Binding PendingChanges}" 
      AutoGenerateColumns="False" 
      IsReadOnly="True" 
      SelectionMode="Extended"> 
    <i:Interaction.Behaviors> 
     <behaviors:MultiSelectGridSelectedItemsBehavior SelectedItems="{Binding SelectedPendingChanges, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
    </i:Interaction.Behaviors> 
    <DataGrid.Columns> 
     <DataGridCheckBoxColumn Binding="{Binding Path=IsSelected,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}}"> 
      <DataGridCheckBoxColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox 
           behaviors:DataGridSelectAllBehavior.Value="{Binding IsChecked,RelativeSource={RelativeSource Self}}" 
           behaviors:DataGridSelectAllBehavior.DataGrid="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"/> 
       </DataTemplate> 
      </DataGridCheckBoxColumn.HeaderTemplate> 
     </DataGridCheckBoxColumn> 
     <DataGridTextColumn Header="Name" 
          Width="Auto" 
          Binding="{Binding Name, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="State" 
          Width="Auto" 
          Binding="{Binding State, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Folder" 
          Width="*" 
          Binding="{Binding ParentFolderPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </DataGrid.Columns> 
</DataGrid> 
Смежные вопросы