2009-08-04 5 views
12

Ho un datagrid in WPF che sto vincolando ad un oggetto.WPF Toolkit Datagrid - come si disattiva la selezione?

Ho un DataGridCheckBoxColumn su cui voglio che gli utenti possano passare e spuntare quelli che vogliono. Il problema è che devono cliccare due volte, una volta per la selezione e poi di nuovo per selezionare/deselezionare. Come diavolo lo spegni, sto cercando il modo di desiderare a lungo di trovare la risposta a questo. Il datagrid ha proprietà SelectionMode e SelectionUnit - nessuno dei quali accetta 'none' o 'go away'

Qualsiasi aiuto è apprezzato! Il mio codice è sotto per riferimento

<my:DataGrid Margin="15" Name="dgPreview" 
     AutoGenerateColumns="False" CanUserSortColumns="True" 
      CanUserDeleteRows="True" 
      Background="White" 
      ColumnHeaderHeight="20" 
      VerticalScrollBarVisibility="Visible" 
      RowDetailsVisibilityMode="Visible" 
      > 

    <my:DataGrid.Columns> 
     <my:DataGridCheckBoxColumn MinWidth="50" Width="Auto" Header="Include" Binding="{Binding Include}" /> 
     <my:DataGridTextColumn MinWidth="50" Width="Auto" Header="Override #" Binding="{Binding OverrideNumber}" /> 
     <my:DataGridTextColumn MinWidth="220" Width="*" Header="Name" Binding="{Binding Name}" /> 
     <my:DataGridTextColumn MinWidth="50" Width="Auto" IsReadOnly="True" Header="Preview" Binding="{Binding Preview}" /> 
    </my:DataGrid.Columns> 
</my:DataGrid> 
+0

Domanda più recente su questo argomento, con molte buone risposte: http://stackoverflow.com/questions/3833536/how-to-perform-single-click-checkbox-selection-in-wpf-datagrid/8333704#8333704 – surfen

risposta

19

Il primo clic mette il cellulare in modalità di modifica poi il secondo clic consente di modificare la casella di controllo. È possibile modificare questo comportamento utilizzando un DataGridTemplateColumn anziché un DataGridCheckBoxColumn. Sostituire il DataGridCheckBoxColumn con questo:

<my:DataGridTemplateColumn MinWidth="50" Width="Auto" Header="Include" SortMemberPath="Include"> 
    <my:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
     <CheckBox Style="{StaticResource DataGridCheckBoxStyle}" IsChecked="{Binding Path=Include}" /> 
     </DataTemplate> 
    </my:DataGridTemplateColumn.CellTemplate> 
</my:DataGridTemplateColumn> 

DataGridCheckBoxStyle rende solo il CheckBox guardare un po 'più in DataGrid:

<Style x:Key="DataGridCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}"> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    <Setter Property="Margin" Value="8,0,3,0" /> 
</Style> 
+0

eccellente, grazie mille John! – RodH257

+2

Non funziona per me in WPF 4.0. Grazie per lo stile però. :) – bugfixr

+0

Funziona per me in WPF 4.0. Tuttavia, ricevo un avvertimento durante la compilazione e nella finestra di progettazione per il "BasedOn" -Tag nello stile: 'La risorsa" {x: Type CheckBox} "non è stata trovata. L'ho appena rimossa e funziona. – OneWorld

1

Innanzitutto, so che questa è una domanda piuttosto vecchio, ma ho ancora pensato che' d prova e rispondi

Ho avuto lo stesso problema un paio di giorni fa e ho trovato una soluzione sorprendentemente breve per questo (vedere this blog). In pratica, tutto quello che dovete fare è sostituire la definizione DataGridCheckBoxColumn nel vostro XAML con il seguente:

<DataGridTemplateColumn Header="MyCheckBoxColumnHeader"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Path=MyViewModelProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Il vantaggio di questa soluzione è ovvia - è XAML-only; quindi si astiene efficacemente dal gravare il codeback con una logica UI aggiuntiva e ti aiuta a mantenere il tuo status agli occhi degli zeloti di MVVM;).

+0

È la stessa risposta di quella precedente. – BenjaminPaul

+0

Grazie per questa risposta. Quanto sopra non ha funzionato per me nel senso che facendo clic su una casella di controllo non è stato effettivamente modificato gli oggetti sottostanti. Credo che il fatto che tu abbia aggiunto in Mode = TwoWay ha risolto il problema. – muaddib