2009-09-29 20 views
9

Vorrei sapere se sarebbe possibile aggiungere funzionalità al pulsante "Seleziona tutto" nell'angolo in alto a sinistra di un datagrid in modo che deselezioni anche tutte le righe? Ho un metodo collegato a un pulsante che esegue questa operazione, ma sarebbe bello se potessi attivare questo metodo dal pulsante Seleziona tutto, per mantenere la funzionalità nella stessa parte della vista. Questo pulsante 'Seleziona tutto' può essere aggiunto al codice e, in tal caso, come si arriva al pulsante? Non sono stato in grado di trovare esempi o suggerimenti.Wagr Datagrid "Seleziona tutto" - "Deseleziona tutto" anche?

risposta

11

OK dopo un sacco di ricerche ho trovato il modo di farlo arrivare al pulsante da Colin Eberhardt, qui:

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

Poi ho esteso il metodo "Grid_Loaded" nella sua classe per aggiungere un evento gestore del pulsante, ma ricorda di rimuovere prima il comando "Seleziona tutto" predefinito (altrimenti, dopo aver eseguito il gestore di eventi che abbiamo aggiunto, il comando viene eseguito).

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

In sostanza, se tutte le righe non selezionate è 'seleziona tutto', se non è 'deseleziona tutto'. Funziona praticamente come se dovessi aspettarti una selezione/deseleziona tutto per funzionare, non posso credere che non abbiano fatto il comando di farlo in modo predefinito per essere onesti, forse nella prossima versione.

Spero che questo aiuti qualcuno in ogni caso, Cheers, Will

+0

Molto utile grazie! – Sharun

+2

Grazie - L'esempio di codice sarebbe completo se la definizione di "GetSelectAllButtonTemplate()" fosse inclusa. – PandaWood

Problemi correlati