相关文章推荐
坏坏的麦片  ·  C# winform ...·  12 月前    · 
爱笑的脸盆  ·  MySQL ...·  1 年前    · 
独立的扁豆  ·  【CSS】364- 让CSS ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I've spent the past hour searching for solutions to what should be a simple problem: how to create a single-click-editable bound CheckBox in Xceed's community DataGridControl .

To be clear: I want a CheckBox column where the user may click any CheckBox , regardless of what row is selected, and have the view model's IsSelected property changing accordingly.

Below is the latest permutation I've tried. This code reads the value from the model, but clicking the CheckBox does not call the IsSelected setter for some reason.

<xcdg:DataGridControl x:Name="DictionariesDataGridControl" ItemsSource="{Binding Mode=OneWay, Source={StaticResource DictionariesViewSource}}" AutoCreateColumns="False" AutoRemoveColumnsAndDetailConfigurations="False" SelectionMode="Extended" NavigationBehavior="RowOnly">
    <xcdg:DataGridControl.View>
        <xcdg:TableView UseDefaultHeadersFooters="False" ShowRowSelectorPane="False" VerticalGridLineThickness="0">
            <xcdg:TableView.FixedHeaders>
                <DataTemplate>
                    <xcdg:ColumnManagerRow BorderThickness="0"/>
                </DataTemplate>
            </xcdg:TableView.FixedHeaders>
        </xcdg:TableView>
    </xcdg:DataGridControl.View>
    <xcdg:DataGridControl.Columns>
        <xcdg:Column FieldName="IsSelected" MinWidth="20" MaxWidth="20" CellEditorDisplayConditions="RowIsCurrent">
            <xcdg:Column.CellContentTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding ., Mode=OneWay}" IsHitTestVisible="False"/>
                </DataTemplate>
            </xcdg:Column.CellContentTemplate>
            <xcdg:Column.CellEditor>
                <xcdg:CellEditor>
                    <xcdg:CellEditor.EditTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding ., Mode=TwoWay}"/>
                        </DataTemplate>
                    </xcdg:CellEditor.EditTemplate>
                </xcdg:CellEditor>
            </xcdg:Column.CellEditor>
        </xcdg:Column>
    </xcdg:DataGridControl.Columns>

EDIT 1

I'm trying this, which does exactly what I need:

<xcdg:Column FieldName="IsSelected" MinWidth="20" MaxWidth="20" CellEditorDisplayConditions="Always"/>

except that, for some reason, the CheckBox is styled with a blue background!

I've selected the element in the visual tree that has a Background property defined as SolidColorBrush with #FF0000FF as the color:

EDIT 2

I decompiled the DataGridCheckBox class that Xceed uses to render the CheckBox and found this override:

public override void OnApplyTemplate()
  base.OnApplyTemplate();
  this.ChildCheckBox.Background = (Brush) new SolidColorBrush(Colors.Blue);

What a bizarre decision by Xceed to arbitrarily set the background color to blue.

EDIT 3

Using @JBrooks' answer, I tried the following:

<xcdg:Column FieldName="IsSelected" MinWidth="20" MaxWidth="20" CellEditorDisplayConditions="Always">
    <xcdg:Column.CellEditor>
        <xcdg:CellEditor>
            <xcdg:CellEditor.EditTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding ., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </xcdg:CellEditor.EditTemplate>
        </xcdg:CellEditor>
    </xcdg:Column.CellEditor>
</xcdg:Column>

Unfortunately, for some reason the setter on the IsSelected property is never called when I check the box. The getter is called several times, though, and the CheckBoxes are appearing correctly on initial bind.

This is apparently a known bug in DataGridCheckBox. So much for code review... wpftoolkit.codeplex.com/workitem/20210 – NathanAldenSr Oct 4, 2016 at 1:13 3 questions: Is there anything in the output window? Do you have something similar to the event CurrentCellChanged captured? Do the setter get set when the checkbox loses focus? – JBrooks Oct 4, 2016 at 21:38 1. Nothing in the Output window, no. I don't have any special logging turned on, though. 2. The only event I've explicitly wired to is ItemsSourceChangeCompleted, in order to populate the collection view's SortDescriptions collection. 3. The setter is never called no matter how I manipulate the check boxes, including changing selections, using TAB key, etc. – NathanAldenSr Oct 5, 2016 at 0:09 Possible duplicate of How to set up the datagrid control from the Xceed\Extended WPF Toolkit with checkbox column and binding – NathanAldenSr Oct 5, 2016 at 0:22

You have both a CellContentTemplate and a CellEditor, so the first click does the "go into edit mode" logic. Just have a single one like below. This is for a normal WPF DataGrid, but maybe you can try something similar for your grid.

  <DataGridTemplateColumn Header="Active" SortMemberPath="IsActive"  >
     <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
           <CheckBox IsChecked="{Binding IsActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsEnabled}" Style="{StaticResource rightsCB}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
  </DataGridTemplateColumn>

For this DataGrid I also have these properties set:

SelectedItem="{Binding SelectedUser, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionUnit="FullRow" SelectionMode="Single"

So this DataGrid does act like what you want - I click the checkbox in row 4 and the IsChecked changes and it also makes row 4 the current row which sets the SelectedUser to the user bound to row 4.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.