wpf 如果XAML中值为负/正值,则使DataGrid单元格的背景更改颜色

r8xiu3jd  于 2023-02-13  发布在  其他
关注(0)|答案(2)|浏览(188)

自我解释的问题,但为进一步明确,文本在单元格的PnL列将是随机的,如"-423.21"或"73.21"。我希望它只是改变单元格背景绿色,如果它是高于0和红色,如果它是低于。
这是我尝试过的:

<DataGridTextColumn Header="PnL" Binding="{Binding PnL}" Width="Auto">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding PnL}" Value="0">
                                    <Setter Property="Background" Value="Orange" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding PnL}" Value="{x:Static sys:Double.MinValue}">
                                    <Setter Property="Background" Value="Red" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding PnL}" Value="{x:Static sys:Double.MaxValue}">
                                    <Setter Property="Background" Value="Green" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
bqf10yzr

bqf10yzr1#

你可以为笔刷属性使用一个转换器。它可以包含你喜欢的笔刷颜色的所有逻辑。
这是我之前做的一个只显示红色和绿色。
这是通用的,检查控件的文本,但你可以绑定一个特定的已知属性。你也可以传递不同的画笔作为markupextension的属性。

public class MoneyValueToBrushConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double num;
        if (!Double.TryParse(value.ToString(), out num))
        {
            return Brushes.Black;
        }
        return num > 0 ? Brushes.Green : Brushes.Red;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

可以将其与背景笔刷一起使用:

<DataGridTextColumn.ElementStyle>
      <Style TargetType="{x:Type TextBlock}">
           <Setter Property="Background" Value="{Binding Text, RelativeSource={RelativeSource Self}, Converter={local:MoneyValueToBrushConverter}}"/>
       </Style>
  </DataGridTextColumn.ElementStyle>

这是它在我的数据网格中工作的情况:

kkih6yb8

kkih6yb82#

您可以为此使用两个值转换器,一个小于转换器和一个大于转换器。

<Style TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger Binding="{Binding PnL}" Value="0">
            <Setter Property="Background" Value="Orange" />
        </DataTrigger>
        <DataTrigger Binding="{Binding PnL, 
                               Converter={StaticResource LessThanConverter}, 
                               ConverterParameter=0" 
                     Value="True">
            <Setter Property="Background" Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding PnL, 
                               Converter={StaticResource GreaterThanConverter}, 
                               ConverterParameter=0" 
                     Value="True">
            <Setter Property="Background" Value="Green" />
        </DataTrigger>
    </Style.Triggers>
</Style>

MSN有创建转换器的文档。https://learn.microsoft.com/en-us/dotnet/desktop/wpf/data/how-to-convert-bound-data
您也可以只使用两个转换器中的一个,并使用True和False两个触发器,但您需要确保Value=“0”的DataTrigger是声明顺序中的最后一个触发器,否则当值为0时,您将无法获得橙子背景。

相关问题