2009-09-29 10 views
9

Je voudrais savoir s'il serait possible d'ajouter des fonctionnalités au bouton 'Sélectionner tout' en haut à gauche d'une grille de données afin de désélectionner toutes les lignes? J'ai une méthode attachée à un bouton qui fait cela, mais ce serait génial si je pouvais déclencher cette méthode à partir du bouton Sélectionner tout, pour garder la fonctionnalité dans la même partie de la vue. Est-ce que ce bouton "Sélectionner tout" peut contenir du code, et si oui, comment accéder au bouton? Je n'ai pas été en mesure de trouver des exemples ou des suggestions.WPF Datagrid Bouton "Sélectionner tout" - "Désélectionner tout"?

Répondre

11

OK après beaucoup de recherches, je trouve comment faire accéder au bouton de Colin Eberhardt, ici:

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

Je prolonge la méthode « Grid_Loaded » dans sa classe pour ajouter un événement mais n'oubliez pas de supprimer la commande par défaut 'Select All' (sinon, après l'exécution du gestionnaire d'événements que nous avons ajouté, la commande est exécutée).

/// <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; 
} 

Essentiellement, si toutes les lignes ne sont pas sélectionnés il sélectionne tous ', sinon' désélectionne tout. Cela fonctionne à peu près comme si vous attendiez un select/unselect all à travailler, je ne peux pas croire qu'ils n'ont pas fait la commande par défaut pour être honnête, peut-être dans la prochaine version.

Hope this helps quelqu'un de toute façon, Cheers, Will

+0

Très utile merci! – Sharun

+2

Merci - L'exemple de code serait complet si la définition de 'GetSelectAllButtonTemplate()' était incluse. – PandaWood

Questions connexes