WPF DataGrid单元格数值大于等于指定值时如何修改背景色?
问题原因
- XAML中样式触发器使用错误:你第二个
<Trigger>仅指定了属性未指定触发条件,该触发器永远不会触发,嵌套在内的Converter绑定自然不会生效。 - 转换器逻辑与需求不符:当前Converter中判断逻辑为数值小于1时返回红色,和你需要的「数值大于0更改背景色」的要求相反。
- 缺少转换器资源声明:你使用
{StaticResource converter}调用转换器前,需要先在界面资源字典中注册转换器实例,否则会找不到资源导致绑定失败。 - 未做异常兼容:Converter中直接强转
int,如果绑定值为空、类型不匹配时会抛出运行时异常。
解决步骤
1. 注册转换器到界面资源
首先在你的Window/UserControl的头部声明转换器所在命名空间,再在资源字典中实例化转换器:
<!-- 窗口头部添加命名空间别名,替换为你自己的项目命名空间 --> <Window x:Class="你的项目命名空间.窗口类名" xmlns:local="clr-namespace:你的项目命名空间" 其他属性...> <!-- 窗口资源中注册转换器 --> <Window.Resources> <local:Greaterthan x:Key="MissingValueConverter"/> </Window.Resources>
2. 修正DataGrid列样式
去掉无效的触发器,直接在样式的Setter中绑定背景色使用转换器,保留原有数值为0时的绿色触发规则:
<DataGridTextColumn Header="Mangel" Binding="{Binding Path=Missing}" Width="*" IsReadOnly="True"> <DataGridTextColumn.ElementStyle> <Style TargetType="{x:Type TextBlock}"> <!-- 非0值时走转换器逻辑 --> <Setter Property="Background" Value="{Binding Missing, Converter={StaticResource MissingValueConverter}}"/> <Style.Triggers> <Trigger Property="Text" Value="0"> <Setter Property="Background" Value="LightGreen"/> </Trigger> </Style.Triggers> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn>
3. 修正转换器逻辑
调整判断规则,添加异常兼容:
public class Greaterthan : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // 兼容空值、类型不匹配的情况 if (value == null || !int.TryParse(value.ToString(), out int input)) return DependencyProperty.UnsetValue; // 大于0时返回红色背景,可自行替换为你需要的颜色 if (input > 0) { return new SolidColorBrush(Colors.Red); } return DependencyProperty.UnsetValue; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
内容的提问来源于stack exchange,提问作者Gerken
相关产品推荐
相关产品推荐

