WPF MVVM:如何通过单选按钮组变更事件修改DataGridRow背景色?
解决方案
问题背景
拥有包含「Source」和「Change source」列的DataGrid,「Change source」列包含3个单选按钮。需实现逻辑:单选按钮值变更时,若「Source」与选中值不等则高亮对应行;若选中值恢复为「Source」原始值,则取消行高亮。已能捕获单选按钮变更事件,需完善判断逻辑。
方法一:在ViewModel的事件处理中实现判断
直接在EntryOnPropertyChanged方法里,将事件发送者转为MyModel实例,对比Source与selectedSrcOption的值,更新StateRowChanged属性:
private void EntryOnPropertyChanged(object sender, PropertyChangedEventArgs args) { if (args.PropertyName == nameof(MyModel.selectedSrcOption)) { var model = sender as MyModel; if (model != null) { // 忽略大小写对比,可根据需求调整为StringComparison.Ordinal model.StateRowChanged = !string.Equals(model.Source, model.selectedSrcOption, StringComparison.OrdinalIgnoreCase); } } }
方法二:在Model内部封装逻辑(推荐,符合MVVM)
将判断逻辑整合到Model的selectedSrcOption属性中,当值变更时自动更新StateRowChanged,无需ViewModel监听事件,解耦性更好:
// 新增selectedSrcOption的完整属性实现 private string _selectedSrcOption; public string selectedSrcOption { get { return _selectedSrcOption; } set { if (_selectedSrcOption == value) return; _selectedSrcOption = value; OnPropertyChanged(nameof(selectedSrcOption)); // 自动对比并更新行状态 StateRowChanged = !string.Equals(Source, _selectedSrcOption, StringComparison.OrdinalIgnoreCase); } } // 保留原有的StateRowChanged属性 private bool _stateRowChanged; public bool StateRowChanged { get { return _stateRowChanged; } set { if (value == _stateRowChanged) return; _stateRowChanged = value; OnPropertyChanged(nameof(StateRowChanged)); } }
使用此方法后,可删除ViewModel中对MyModel.PropertyChanged的监听代码,逻辑完全由Model自行处理。
可选:优化XAML触发器
原XAML的两个DataTrigger可简化,默认背景设为White,仅在StateRowChanged为True时切换为红色:
<DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Background" Value="White"/> <Style.Triggers> <DataTrigger Binding="{Binding StateRowChanged}" Value="True"> <Setter Property="Background" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </DataGrid.RowStyle>
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

