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
相关产品推荐
相关产品推荐

