2009-09-29 14 views
9

Me gustaría saber si sería posible agregar funcionalidad al botón "Seleccionar todo" en la parte superior izquierda de una cuadrícula de datos para que también se deshagan todas las filas? Tengo un método adjunto a un botón que hace esto, pero sería genial si pudiera iniciar este método desde el botón Seleccionar todo, para mantener la funcionalidad en la misma parte de la vista. ¿Este botón "Seleccionar todo" tiene un código agregado y, de ser así, cómo se puede acceder al botón? No he podido encontrar ningún ejemplo o sugerencia.WPF Datagrid Botón "Seleccionar todo" - "Deseleccionar todo" también?

Respuesta

11

OK después de mucho buscar he encontrado la manera de hacer llegar al botón de Colin Eberhardt, aquí:

Styling hard-to-reach elements in control templates with attached behaviours

Entonces extendió el método "Grid_Loaded" en su clase para añadir un evento manipular el botón, pero recuerde eliminar primero el comando predeterminado 'Seleccionar todo' (de lo contrario, después de ejecutar el controlador de eventos que hemos agregado, se ejecuta el comando).

/// <summary> 
/// Handles the DataGrid's Loaded event. 
/// </summary> 
/// <param name="sender">Sender object.</param> 
/// <param name="e">Event args.</param> 
private static void Grid_Loaded(object sender, RoutedEventArgs e) 
{ 
    DataGrid grid = sender as DataGrid; 
    DependencyObject dep = grid; 

    // Navigate down the visual tree to the button 
    while (!(dep is Button)) 
    { 
     dep = VisualTreeHelper.GetChild(dep, 0); 
    } 

    Button button = dep as Button; 

    // apply our new template 
    ControlTemplate template = GetSelectAllButtonTemplate(grid); 
    button.Template = template; 
    button.Command = null; 
    button.Click += new RoutedEventHandler(SelectAllClicked); 
} 

/// <summary> 
/// Handles the DataGrid's select all button's click event. 
/// </summary> 
/// <param name="sender">Sender object.</param> 
/// <param name="e">Event args.</param> 
private static void SelectAllClicked(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    DependencyObject dep = button; 

    // Navigate up the visual tree to the grid 
    while (!(dep is DataGrid)) 
    { 
     dep = VisualTreeHelper.GetParent(dep); 
    } 

    DataGrid grid = dep as DataGrid; 

    if (grid.SelectedItems.Count < grid.Items.Count) 
    { 
     grid.SelectAll(); 
    } 
    else 
    { 
     grid.UnselectAll(); 
    } 

    e.Handled = true; 
} 

En esencia, si las filas no se seleccionan que 'se seleccionan todos', si no es deselecciona todos ". Funciona más o menos como esperarías que un seleccionar/deseleccionar todo funcione, no puedo creer que no hicieron el comando de hacer esto de forma predeterminada para ser honesto, tal vez en la próxima versión.

Espero que esto ayude a alguien de todos modos, Saludos, Will

+0

Muy útil gracias! – Sharun

+2

Gracias - El ejemplo de código estaría completo si se incluyera la definición de 'GetSelectAllButtonTemplate()'. – PandaWood

Cuestiones relacionadas