2009-08-04 7 views
12

Ich habe ein Datagrid in WPF, das ich an ein Objekt binde.WPF Toolkit Datagrid - Wie schalten Sie die Auswahl aus?

Ich habe eine DataGridCheckBoxColumn dort, die ich will, dass die Benutzer in der Lage sind, durchzulaufen und die gewünschten anzukreuzen. Problem ist, dass sie zweimal klicken müssen, einmal für die Auswahl und dann wieder zum Aktivieren/Deaktivieren. Wie um alles in der Welt schaltest du das aus? Ich habe lange nach einer Antwort gesucht. Das Datagrid verfügt über SelectionMode- und SelectionUnit-Eigenschaften - keine von beiden akzeptiert 'none' oder 'go away'

Jede Hilfe ist willkommen! Mein Code ist unten für Referenz

<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

Neuere Frage zu diesem Thema, mit vielen guten Antworten: http://stackoverflow.com/questions/3833536/how-to-perform-single-click-checkbox-selection-in-wpf-datagrid/8333704#8333704 – surfen

Antwort

19

Der erste Klick versetzt die Zelle in den Bearbeitungsmodus und der zweite Klick ermöglicht es Ihnen, das Kontrollkästchen zu ändern. Sie können dieses Verhalten ändern, indem Sie eine DataGridTemplateColumn anstelle einer DataGridCheckBoxColumn verwenden. Ersetzen Sie Ihre DataGridCheckBoxColumn mit diesem:

<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 macht nur die CheckBox sehen ein wenig schöner im 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

Ausgezeichnet, vielen Dank John! – RodH257

+2

Funktioniert bei mir in WPF 4.0 nicht. Danke für den Stil. :) – bugfixr

+0

Funktioniert für mich in WPF 4.0. Allerdings bekomme ich beim Kompilieren und im Designer eine Warnung für den "BasedOn" -Tag im Stil: "Die Ressource" {x: Type CheckBox} "wurde nicht gefunden" Ich habe sie einfach entfernt und es funktioniert trotzdem. – OneWorld

1

Zunächst, ich weiß, das ist eine ziemlich alte Frage, aber ich dachte immer noch, ich Ich versuche es und beantworte es.

Ich hatte das gleiche Problem vor ein paar Tagen und stieß auf eine überraschend kurze Lösung dafür (siehe this blog). Grundsätzlich alles, was Sie tun müssen, ist ersetzen Sie die DataGridCheckBoxColumn Definition in XAML mit dem folgenden:

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

Der Vorteil dieser Lösung liegt auf der Hand - es ist XAML-only; Es verhindert effektiv, dass Sie Ihren Code-Back mit zusätzlicher UI-Logik belasten und hilft Ihnen, Ihren Status in den Augen von MVVM-Eiferern zu erhalten;).

+0

Es ist die gleiche Antwort wie oben. – BenjaminPaul

+0

Danke für diese Antwort. Das oben Genannte funktionierte für mich nicht in dem Sinne, dass das Klicken auf ein Kontrollkästchen die zugrunde liegenden Objekte nicht wirklich änderte. Ich glaube, dass die Tatsache, dass Sie im Modus = TwoWay hinzugefügt haben, dieses Problem behoben hat. – muaddib

Verwandte Themen