2012-02-29 54 views
6

Estoy usando la cuadrícula de datos WPF. En el usuario de la cuadrícula de datos tienen encabezados de columna y encabezados de fila.Evento para Seleccionar todo: WPF Datagrid

Cuando los encabezados de columna y los encabezados de fila son visibles, en la esquina superior izquierda tenemos una pequeña sección cuadrada disponible. (sección transversal en la esquina superior izquierda donde se encuentran los encabezados de columna y fila) cuando hacemos clic en él, selecciona todas las celdas dentro de la cuadrícula de datos. ¿Hay algún evento para eso? Si no, ¿cómo puede atrapar ese evento? Por favor guíame.

Háganme saber si necesita cualquier otra información sobre este problema.

Saludos, Priyank

Respuesta

12

La cuadrícula de datos maneja el comando enrutado ApplicationCommand.SelectAll, de modo que si la cuadrícula tiene el foco y presiona Ctrl-A, o hace clic en el botón de esquina, se seleccionan todas las celdas. Puede manejar este comando usted mismo añadiendo un CommandBinding en XAML:

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

O puede agregar el comando de unión en código:

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

Sin embargo, sólo puede haber un único controlador para un enrutado comando, por lo que de forma predeterminada agregar este controlador esto evitará que todos seleccione trabajar en la cuadrícula de datos. En su controlador, necesita llamar a SelectAll.

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

No es una solución bastante agradable, pero se puede manejar un evento como "SelectionChanged" y comprobar si el número de elementos seleccionados es igual al número de elementos en el origen de datos

0

que prefieren evitar el uso de un código detrás de las vistas, así que hemos hecho de esta manera: enter image description here

enter image description here

Es CheckBox en la esquina superior izquierda que seleccionar/deseleccionar todos .

La solución se construyen a partir de 2 partes: Propiedades adjunto y especial estructura XAML:

1). propiedades adjuntos:

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>