2009-08-04 7 views
12

J'ai une DataGrid dans WPF que je lie à un objet.WPF Toolkit Datagrid - comment désactiver la sélection?

J'ai un DataGridCheckBoxColumn là où je veux que les utilisateurs puissent passer et cocher ceux qu'ils veulent. Le problème est qu'ils doivent cliquer deux fois, une fois pour la sélection puis à nouveau pour cocher/décocher. Comment diable avez-vous éteint cela, j'ai cherché longtemps à trouver la réponse à cette question. La grille de données possède des propriétés SelectionMode et SelectionUnit - aucune d'elles n'acceptant 'none' ou 'go away'

Toute aide est appréciée! Mon code est ci-dessous pour référence

<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

Une question récente sur ce sujet, avec beaucoup de bonnes réponses: http://stackoverflow.com/questions/3833536/how-to-perform-single-click-checkbox-selection-in-wpf-datagrid/8333704#8333704 – surfen

Répondre

19

Le premier clic place la cellule en mode édition puis le deuxième clic vous permet de modifier la case à cocher. Vous pouvez modifier ce comportement en utilisant un DataGridTemplateColumn au lieu d'un DataGridCheckBoxColumn. Remplacez votre DataGridCheckBoxColumn par ceci:

<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 fait juste le CheckBox regarder un peu plus agréable dans le 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

excellent, merci John! – RodH257

+2

Ne fonctionne pas pour moi dans WPF 4.0. Merci pour le style cependant. :) – bugfixr

+0

Fonctionne pour moi dans WPF 4.0. Cependant, je reçois un avertissement lors de la compilation et dans le concepteur pour le "BasedOn" -Tag dans le style: 'La ressource" {x: Type CheckBox} "n'a pas été trouvé' Je l'ai juste enlevé et ça marche. – OneWorld

1

d'abord, je sais que c'est une question assez vieux mais je pensais encore que je d essayer et y répondre.

J'ai eu le même problème il y a quelques jours et je suis tombé sur une solution étonnamment courte pour cela (voir this blog). En gros, tout ce que vous devez faire est de remplacer la définition DataGridCheckBoxColumn dans votre XAML avec les éléments suivants:

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

L'avantage de cette solution est évidente - il est XAML seulement; Ainsi, il vous évite de surcharger votre code-back avec une logique d'interface utilisateur supplémentaire et vous aide à maintenir votre statut aux yeux des zélateurs de MVVM;).

+0

C'est la même réponse que celle ci-dessus. – BenjaminPaul

+0

Merci pour cette réponse. Ce qui précède n'a pas fonctionné pour moi dans le sens où le fait de cliquer sur une case n'a pas changé les objets sous-jacents. Je crois que le fait que vous avez ajouté dans le Mode = TwoWay a résolu ce problème. – muaddib

Questions connexes