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

XAML如何根据订单剩余天数设置条件规则实现不同背景颜色效果

实现思路

WPF原生DataTrigger仅支持固定值匹配,不直接支持大于/小于等范围判断,你可以通过以下两种常用方案实现需求:

方案1:使用IValueConverter(推荐新手使用,逻辑清晰易维护)

  1. 首先新增一个值转换器类,将剩余天数转换为对应的背景色:
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;

namespace Okna.Documents.Views.User
{
    public class RemainingDaysToBackgroundConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || !int.TryParse(value.ToString(), out int days))
                return Brushes.Transparent; // 异常值默认透明
            
            return days switch
            {
                > 5 => Brushes.Green,
                > 3 and <=5 => Brushes.Yellow, // 可自行调整其他区间规则
                <=0 => Brushes.Red,
                _ => Brushes.Transparent
            };
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
  1. 修改XAML代码,引入转换器并绑定即可:
<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:user="clr-namespace:Okna.Documents.Views.User;assembly=Okna.Documents">
    <!-- 声明转换器资源 -->
    <DataTemplate.Resources>
        <user:RemainingDaysToBackgroundConverter x:Key="DaysToBgConverter"/>
    </DataTemplate.Resources>
    
    <Grid x:Name="grid"
          Background="{Binding RowData.Row.ud_pozostalo_dni2, Converter={StaticResource DaysToBgConverter}}">
        <TextBlock
            Margin="3,2"
            Text="{Binding RowData.Row.ud_pozostalo_dni2}" />
    </Grid>
</DataTemplate>

方案2:使用带比较逻辑的DataTrigger(灵活适配多条件场景)

如果需要保留触发器写法,可新增通用比较转换器实现范围判断:

  1. 新增比较转换器类:
using System;
using System.Globalization;
using System.Windows.Data;

namespace Okna.Documents.Views.User
{
    public class GreaterThanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || parameter == null 
                || !int.TryParse(value.ToString(), out int input) 
                || !int.TryParse(parameter.ToString(), out int threshold))
                return false;
            
            return input > threshold;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
  1. XAML中通过触发器匹配转换器返回的布尔值即可:
<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:user="clr-namespace:Okna.Documents.Views.User;assembly=Okna.Documents">
    <DataTemplate.Resources>
        <user:GreaterThanConverter x:Key="GreaterThanConverter"/>
    </DataTemplate.Resources>
    
    <Grid x:Name="grid">
        <TextBlock
            Margin="3,2"
            Text="{Binding RowData.Row.ud_pozostalo_dni2}" />
    </Grid>
    <DataTemplate.Triggers>
        <!-- 剩余天数大于5时设绿色 -->
        <DataTrigger
            Binding="{Binding RowData.Row.ud_pozostalo_dni2, Converter={StaticResource GreaterThanConverter}, ConverterParameter=5}"
            Value="True">
            <Setter
                TargetName="grid"
                Property="Background"
                Value="Green" />
        </DataTrigger>
        <!-- 可新增其他触发器扩展规则 -->
    </DataTemplate.Triggers>
</DataTemplate>

注意事项

  • 转换器类的命名空间要和XAML里引入的user命名空间对应,否则会找不到资源
  • 如果ud_pozostalo_dni2字段是字符串类型,记得在转换器里做兼容处理,避免转换报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:04