WPF DataGrid行与内嵌Checkbox联动异常排查及修复
异常原因分析
当勾选Checkbox时,双向绑定会将IsObjSelected设为true,同步到DataGridRow.IsSelected使其变为选中状态。但DataGrid的默认交互逻辑会处理点击Checkbox的事件,触发行选中状态的切换(相当于重复触发行点击),导致IsSelected被重新设为false,同步回IsObjSelected后,Checkbox就会被立即取消勾选,形成状态来回跳动的异常。
同时,你的Person类中IsObjSelected属性的setter未做值变化判断,即使值未改变也会触发PropertyChanged通知,这会加剧绑定循环的问题。
修复方案
1. 优化Person类的属性通知逻辑
修改IsObjSelected属性,添加值变化判断,避免不必要的通知触发:
public bool IsObjSelected { get => _isObjSelected; set { if (_isObjSelected != value) { _isObjSelected = value; NotifyPropertyChanged(nameof(IsObjSelected)); } } }
2. 阻止Checkbox的点击事件冒泡
通过阻止Checkbox的点击事件向上冒泡到DataGridRow,避免DataGrid触发默认的行选中状态切换逻辑:
在XAML的Checkbox中添加事件处理:
<CheckBox HorizontalAlignment="Center" IsChecked="{Binding IsObjSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown"/>
在窗口后台代码中实现事件处理方法:
private void CheckBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { e.Handled = true; }
效果验证
修复后三个需求均可正常运行:
- 点击行任意位置:
DataGridRow.IsSelected变为true,同步到IsObjSelected,Checkbox自动勾选; - 勾选未选中的Checkbox:
IsObjSelected变为true,同步到DataGridRow.IsSelected,行被选中,无额外状态切换; - 取消已选中的Checkbox:
IsObjSelected变为false,同步到DataGridRow.IsSelected,行取消选中,无异常跳转。
内容的提问来源于stack exchange,提问作者5ORBEX
相关产品推荐
相关产品推荐

