Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    710

    [WPF] Colonna: seleziona tutti

    Buon dì,
    nel mio DataGrid, vorrei inserire una "Seleziona tutto" per ogni riga presente.

    Nello XAML:
    codice:
    <DataGridTemplateColumn>
    	<DataGridTemplateColumn.Header>
    		<CheckBox Name="chkbxSelectAll" PreviewMouseLeftButtonDown="chkbxSelectAll_PreviewMouseLeftButtonDown"></CheckBox>
    	</DataGridTemplateColumn.Header>
    	<DataGridTemplateColumn.CellTemplate>
    		<DataTemplate>
    			<CheckBox x:Name="CheckBox"
    		  PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" />
    		</DataTemplate>
    	</DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    

    Il metodo CheckBox_PreviewMouseLeftButtonDown:
    codice:
    private void CheckBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    	var chk = (CheckBox)sender;
    	var row = VisualTreeHelpers.FindAncestor<DataGridRow>(chk);
    	var newValue = !chk.IsChecked.GetValueOrDefault();
    
    	row.IsSelected = newValue;
    	chk.IsChecked = newValue;
    
    	e.Handled = true;
    }
    

    funziona bene.
    Idee o suggerimenti per il "Seleziona tutto"?

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    710
    Risolto,
    ho aggiunto una property al mio modello:

    codice:
    [DisplayName("IsChecked")]
    public bool IsChecked { get; set; }
    nel mio CS ho inserito:
    codice:
    private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked)
    {
    	var items = dgPlan.Items.OfType<AnalysisPlanItem>();
    	foreach (var item in items)
    	{
    		item.IsChecked = IsChecked;
    	}
    
    
    	dgPlan.Items.Refresh();
    }
    
    
    private void chkbxSelectAll_Checked(object sender, RoutedEventArgs e)
    {
    	HeadCheck(sender, e, true);
    }
    
    
    private void chkbxSelectAll_Unchecked(object sender, RoutedEventArgs e)
    {
    	HeadCheck(sender, e, false);
    }
    nello XAML:
    codice:
    <DataGridTemplateColumn>
    	<DataGridTemplateColumn.Header>
    		<CheckBox Name="chkbxSelectAll" Checked="chkbxSelectAll_Checked" Unchecked="chkbxSelectAll_Unchecked" />
    	</DataGridTemplateColumn.Header>
    	<DataGridTemplateColumn.CellTemplate>
    		<DataTemplate>
    			<CheckBox x:Name="CheckBox" IsChecked="{Binding IsChecked}" PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" />
    		</DataTemplate>
    	</DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    Il mio obiettivo era non intaccare il modello...ma alla fine si è rilevata la strada più semplice.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da exFelino Visualizza il messaggio
    Risolto,
    ho aggiunto una property al mio modello:

    codice:
    [DisplayName("IsChecked")]
    public bool IsChecked { get; set; }
    nel mio CS ho inserito:
    codice:
    private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked)
    {
        var items = dgPlan.Items.OfType<AnalysisPlanItem>();
        foreach (var item in items)
        {
            item.IsChecked = IsChecked;
        }
    
    
        dgPlan.Items.Refresh();
    }
    
    
    private void chkbxSelectAll_Checked(object sender, RoutedEventArgs e)
    {
        HeadCheck(sender, e, true);
    }
    
    
    private void chkbxSelectAll_Unchecked(object sender, RoutedEventArgs e)
    {
        HeadCheck(sender, e, false);
    }
    nello XAML:
    codice:
    <DataGridTemplateColumn>
        <DataGridTemplateColumn.Header>
            <CheckBox Name="chkbxSelectAll" Checked="chkbxSelectAll_Checked" Unchecked="chkbxSelectAll_Unchecked" />
        </DataGridTemplateColumn.Header>
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <CheckBox x:Name="CheckBox" IsChecked="{Binding IsChecked}" PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    Il mio obiettivo era non intaccare il modello...ma alla fine si è rilevata la strada più semplice.
    Basta anche una funzione solo, che fa check/Uncheck. A ogni click fai la negazione (!) del valore bool della proprietà isChecked

  4. #4
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    710
    Uhm...cioè?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da exFelino Visualizza il messaggio
    Uhm...cioè?
    Cioè così, ad esempio:
    codice:
    var items = dgPlan.Items.OfType<AnalysisPlanItem>();
        foreach(var item in items)
        {
            item.IsChecked=!(item.IsChecked)
            // se l'item è selezionato -> il valore diventa FALSE e viceversa..
    }

  6. #6
    Utente di HTML.it L'avatar di exFelino
    Registrato dal
    Jul 2014
    residenza
    Aci Catena (CT)
    Messaggi
    710
    Ottimo, grazie.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.