WPF DataGrid已定义ItemsSource时 内部CheckBox能否使用其他绑定源
WPF DataGrid表头CheckBox绑定主ViewModel解决方案
这个需求完全可实现,你遇到的绑定源冲突本质是DataGrid列的Header不在DataContext的默认继承视觉树中,Header的默认数据上下文不是主窗口的ViewModel,而是列对象本身,因此直接绑定找不到ActivateAllSampleSTR属性。
修复绑定的核心代码
只需要修改表头CheckBox的绑定表达式,显式指定从上级DataGrid控件中拿主ViewModel的上下文即可:
<CheckBox IsChecked="{Binding DataContext.ActivateAllSampleSTR, RelativeSource={RelativeSource AncestorType=DataGrid}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="AliceBlue" Height="16" VerticalAlignment="Top" />
全选逻辑实现
在主ViewModel的ActivateAllSampleSTR属性的set方法中添加批量赋值逻辑即可,示例代码如下:
private bool _activateAllSampleSTR; public bool ActivateAllSampleSTR { get => _activateAllSampleSTR; set { if (_activateAllSampleSTR == value) return; _activateAllSampleSTR = value; OnPropertyChanged(); // 触发INotifyPropertyChanged通知 UpdateAllSampleStatus(value); } } private void UpdateAllSampleStatus(bool status) { foreach (var sample in SampleCollection.Samples) { sample.StrStatus = status; } }
注意事项
- 你绑定的Sample集合中的每一项实体类必须实现
INotifyPropertyChanged接口,修改StrStatus属性时才会同步更新行内CheckBox的状态 - 如果需要实现反向同步(手动勾选所有行后表头自动选中),可以监听集合的
CollectionChanged事件,为每个新增的Sample项订阅PropertyChanged事件,每次有项的StrStatus变化时统计全集合的状态,同步更新ActivateAllSampleSTR的值即可
内容的提问来源于stack exchange,提问作者try_3xcept
相关产品推荐
相关产品推荐

