WPF DataGrid:点击DataGridCheckBoxColumn时禁止选中行
解决DataGridCheckBoxColumn点击触发行选中的问题
我明白你的痛点——点击DataGridCheckBoxColumn中的复选框时会意外触发行选中,进而触发那些耗时的加载操作,拖慢了快速勾选的速度。你已经给其他列应用了DisableSelection样式来避免这个问题,现在只需要把这个样式也应用到复选框列上就行,而且完全不需要替换成普通CheckBox控件。
解决方案
你只需要修改DataGridCheckBoxColumn的CellStyle,让它基于你已经定义好的DisableSelection样式,同时保留原有的事件处理器逻辑。这样既能继承禁用行选中的设置,又不会影响复选框的勾选事件响应。
修改后的完整代码
<DataGrid ItemsSource="{Binding GridModel}" x:Name="patientGrid" VerticalAlignment="Top" AutoGenerateColumns="False" CanUserAddRows="false" Height="484" Grid.RowSpan="2" RenderTransformOrigin="0.497,0.551" > <DataGrid.Resources> <Style x:Key="DisableSelection" TargetType="DataGridCell"> <Setter Property="Focusable" Value="False"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="BorderBrush" Value="Transparent"/> </Style> </DataGrid.Resources> <DataGrid.Columns> <DataGridCheckBoxColumn Header="Choose" x:Name="choose" > <DataGridCheckBoxColumn.CellStyle> <!-- 关键修改:基于DisableSelection样式,而非默认DataGridCell样式 --> <Style TargetType="DataGridCell" BasedOn="{StaticResource DisableSelection}"> <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/> <EventSetter Event="CheckBox.Unchecked" Handler="OnChecked"/> <Setter Property="Background" Value="Transparent" /> </Style> </DataGridCheckBoxColumn.CellStyle> </DataGridCheckBoxColumn> <DataGridTextColumn CellStyle="{StaticResource DisableSelection}" Header="nmbr" x:Name="workIdcl" Binding="{Binding ID}" IsReadOnly="True" /> </DataGrid.Columns> </DataGrid>
为什么这样有效?
DisableSelection样式中的Focusable="False"会阻止单元格获得焦点,进而避免触发行选中状态的变化;- 通过
BasedOn="{StaticResource DisableSelection}",你的复选框列单元格会继承这个样式的所有设置,同时你添加的EventSetter依然能正常监听复选框的勾选/取消事件; - 完全保留了
DataGridCheckBoxColumn的原生特性,不需要替换成普通CheckBox控件,符合你的需求。
内容的提问来源于stack exchange,提问作者abdou_dev
相关产品推荐
相关产品推荐

