I need to vertically center a DataGridCheckBoxColumn
. Since I did not find a Property inside DataGridCheckBoxColumn
, I applied an ElementStyle
. However, when this style is applied, my CheckBox
becomes checkable again, although it is set to ReadOnly
in my DataGrid
(the whole Datagrid
is ReadOnly
), and in DataGridCheckBoxColumn
itself.
How can I create a vertically centered CheckBox
that keeps its ReadOnly
state? Here is my code:
<DataGrid IsReadOnly="True">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Test" IsReadOnly="True" Binding="{Binding MyBinding}">
<DataGridCheckBoxColumn.ElementStyle>
<Style>
<Setter Property="FrameworkElement.Margin" Value="0,1,0,0" />
<Setter Property="FrameworkElement.VerticalAlignment" Value="Center" />
<Setter Property="FrameworkElement.HorizontalAlignment" Value="Center" />
</Style>
</DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
When you set ElementStyle
on the DataGridCheckBoxColumn
you should include FrameworkElement.IsHitTestVisible="False"
to your Style
:
<Setter Property="FrameworkElement.IsHitTestVisible" Value="False"/>
Also if you add TargetType="CheckBox"
to the Style
then you don't have to repeat FrameworkElement
for each Setter
anymore:
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="CheckBox">
<Setter Property="Margin" Value="0,1,0,0" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
</DataGridCheckBoxColumn.ElementStyle>
I have a suspicion that this is a bug (as it doesn't happen on other column types).
To work around it, all you need to do is make sure you base your style on the default style; by adding BasedOn="{x:Static DataGridCheckBoxColumn.DefaultElementStyle}"
to the Style
element:
<DataGrid IsReadOnly="True">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Test" IsReadOnly="True" Binding="{Binding MyBinding}">
<DataGridCheckBoxColumn.ElementStyle>
<Style BasedOn="{x:Static DataGridCheckBoxColumn.DefaultElementStyle}">
<Setter Property="FrameworkElement.Margin" Value="0,1,0,0" />
<Setter Property="FrameworkElement.VerticalAlignment" Value="Center" />
<Setter Property="FrameworkElement.HorizontalAlignment" Value="Center" />
</Style>
</DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>
</DataGrid.Columns>
</DataGrid>
This approach has the advantage that you don't have to do lots of work if you are intending on changing the DataGrid.IsReadOnly
property at runtime.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With