WPF DataGrid自动生成列Checkbox点击后数据源未实时更新如何解决
解决方案
不需要手动生成列,你已经在DataGrid上声明了AutoGeneratingColumn事件,直接在该事件中修改自动生成的复选框列的绑定更新触发时机即可:
- 在MainWindow的后台代码中添加
dgvSystems_AutoGeneratingColumn的实现:
private void dgvSystems_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { // 识别自动生成的复选框列 if (e.Column is DataGridCheckBoxColumn checkBoxColumn) { var binding = checkBoxColumn.Binding as Binding; if (binding != null) { // 将绑定更新源的时机从默认的LostFocus改为属性变更时立即更新 binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; } } // 也可以直接在这里统一设置列宽,不需要在Loaded事件中遍历列 e.Column.Width = new DataGridLength(1, DataGridLengthUnitType.Star); }
原理说明
WPF的DataGrid自动生成列时,为了减少频繁回写数据源的性能开销,所有列的绑定默认将UpdateSourceTrigger设为LostFocus,即只有当前单元格失去焦点时才会把修改同步到数据源,复选框列也遵循这个默认规则。修改为PropertyChanged后,只要复选框的选中状态发生变化,就会立即同步到绑定的数据源属性,触发你写在IsEnabled属性set方法中的启停逻辑。
修改完成后无需调整其他代码,点击复选框就会立刻触发日志输出,不需要等待DataGrid失去焦点。
内容的提问来源于stack exchange,提问作者Tyler Moore
相关产品推荐
相关产品推荐

