WPF MVVM模式下按值设置DataGrid单元格背景色(0灰非0黄)
WPF MVVM下DataGrid单元格按值设置背景色的正确实现
你的原有思路存在问题:DataTable是纯数据容器,不应该用来处理UI样式,而且你写的SetBackgroundColor方法返回类型是void却赋值给DataTable变量,逻辑上根本无法生效。MVVM模式下要严格分离数据和UI,正确的做法是通过XAML的样式触发器或值转换器来实现单元格背景色的动态设置,以下是两种可行方案:
方案一:使用DataTrigger直接判断值
这种方式不需要额外写转换器,直接在XAML的单元格样式里通过触发器判断值:
<DataGrid ItemsSource="{Binding WorkFlowGridCollectionView}" AutoGenerateColumns="True"> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <!-- 默认背景设为黄色(非0的情况) --> <Setter Property="Background" Value="Yellow"/> <!-- 当单元格值为0时,背景改为灰色 --> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text}" Value="0"> <Setter Property="Background" Value="Gray"/> </DataTrigger> </Style.Triggers> </Style> </DataGrid.CellStyle> </DataGrid>
方案二:使用值转换器(更灵活,支持复杂逻辑)
如果后续需要扩展判断逻辑,值转换器是更好的选择:
1. 编写值转换器类
在后台创建实现IValueConverter的转换器,负责根据单元格值返回对应的背景色:
using System; using System.Globalization; using System.Windows.Data; using System.Windows.Media; namespace YourNamespace { public class CellValueToBackgroundConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // 尝试将单元格值转为整数 if (int.TryParse(value?.ToString(), out int cellValue)) { return cellValue == 0 ? Brushes.Gray : Brushes.Yellow; } // 转换失败时默认返回灰色 return Brushes.Gray; } // 反向转换不需要实现,直接抛出异常 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }
2. 在XAML中声明转换器资源
在Window或UserControl的资源里注册这个转换器:
<Window.Resources> <local:CellValueToBackgroundConverter x:Key="CellBackgroundConverter"/> </Window.Resources>
注意:local是你的命名空间前缀,需要在XAML根节点添加xmlns:local="clr-namespace:YourNamespace"。
3. 绑定转换器到DataGrid单元格样式
<DataGrid ItemsSource="{Binding WorkFlowGridCollectionView}" AutoGenerateColumns="True"> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource CellBackgroundConverter}}"/> </Style> </DataGrid.CellStyle> </DataGrid>
后台数据绑定代码修正
你原来的后台代码只需要正常提供数据即可,不需要处理样式:
CollectionViewSource collectionView = new CollectionViewSource(); collectionView.Source = dtStatus; WorkFlowGridCollectionView = collectionView.View;
内容的提问来源于stack exchange,提问作者Sreenivasa Reddy
相关产品推荐
相关产品推荐

