You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:01:23