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

WPF DataGrid属性变更后行/单元格样式因排序失效问题求助

解决方案

核心问题在于直接修改DataGridRow的UI样式是临时性的:当DataGrid排序、虚拟化复用行时,UI元素会重新绑定数据,之前手动设置的样式会被覆盖。正确的做法是把"变更状态"绑定到数据模型,通过样式触发器自动应用高亮。

步骤1:给Tournament模型添加变更状态属性

在Tournament类中新增IsChanged属性,实现INotifyPropertyChanged,并在其他属性变更时将其设为true:

public class Tournament : INotifyPropertyChanged
{
    private bool _isChanged;
    public bool IsChanged
    {
        get => _isChanged;
        set
        {
            if (_isChanged != value)
            {
                _isChanged = value;
                OnPropertyChanged(nameof(IsChanged));
            }
        }
    }

    // 示例属性:Name,变更时标记为已修改
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged(nameof(Name));
                IsChanged = true;
            }
        }
    }

    // 其他属性同理,在setter中设置IsChanged

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:修改DataGrid的RowStyle,通过DataTrigger绑定IsChanged

在XAML中给DataGrid添加行样式,当IsChanged为true时自动应用高亮背景:

<DataGrid x:Name="TournamentGrid" AutoGenerateColumns="False">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" Value="Transparent"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChanged}" Value="True">
                    <Setter Property="Background" Value="Orange"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>

    <!-- 列定义示例 -->
    <DataGridTextColumn Header="名称" Binding="{Binding Name}"/>
    <!-- 其他列... -->
</DataGrid>

步骤3:调整属性变更监听逻辑

原来直接操作DataGridRow的代码,改为更新对应Tournament对象的IsChanged属性即可:

private void OnTournamentPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    var tournament = sender as Tournament;
    tournament?.IsChanged = true; // 修改数据状态,UI自动响应
}

额外说明

  • 如果需要取消高亮(比如用户确认变更后),只需将IsChanged设为false,UI会自动移除样式。
  • 这种数据驱动的方式完全不受DataGrid排序、虚拟化、行复用的影响,是WPF中状态与UI分离的标准实现方式。

内容的提问来源于stack exchange,提问作者Blakhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:09