如果值大于或等于,则更改单元格的背景颜色

Changing background color of cells if a value is greater than or equal to

如果 DataGrid 中的数字大于零,我就无法更改颜色。 我尝试了 IValueConverter,但无法真正发挥作用。它仅在我已经知道 DataGrid 中的值时才有效。 这是我的XAML。绿色是我能做的 下面的代码。我试图将它与 IValueConverter.

绑定
<DataGrid x:Name="dg_ProductlistGrid"  ItemsSource="{Binding ProductCollection}" AutoGenerateColumns="False" IsReadOnly="True" Loaded="form1_load">
       
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="1,1,1,1"/>
            <Setter Property="Padding" Value="30,9,12,6"/>
        </Style>
    </DataGrid.ColumnHeaderStyle>
        
    <DataGrid.Columns>
            
            <DataGridTextColumn Header="ProduktID" Binding="{Binding Path=factProduct.ProductId}" Width="*"  IsReadOnly="True"/>
        <DataGridTextColumn Header="Navn" Binding="{Binding Path= factProduct.Name}" Width="*"  IsReadOnly="True"/>
        <DataGridTextColumn Header="Mængde" Binding="{Binding Path =QauntityNeeded }" Width="*"  IsReadOnly="True"/>
        <DataGridTextColumn Header="Rigtige Mængde" Binding="{Binding Path =FoundQauntity }" Width="*"  IsReadOnly="True"/>
        <DataGridTextColumn Header="Mangel" Binding="{Binding Path = Missing}" Width="*"  IsReadOnly="True">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <Trigger Property="Text" Value="0">
                            <Setter Property="Background" Value="LightGreen"/>
                        </Trigger>
                        <Trigger Property="Text" >
                                <Setter Property="Background" Value="{Binding Path=Missing, Converter={StaticResource converter}}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

这是我的 IValueConverter:

public class Greaterthan : IValueConverter
{
    
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int input = (int)value;
        if (input < 1)
        {
            return new SolidColorBrush(Colors.Red);
        }
        else
            return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我该如何解决这个问题?

您的转换器不检查该值是否大于零,而是检查它是否小于一。您可以简化您的转换器并同时使其更强大。期望 大于 值作为转换器的参数。尽管您可以将 XAML 中的 int 指定为参数,但将值指定为 string 更具可读性,正如您在下面使用转换器时所做的那样。此转换器将 string 值和参数解析为 int 和 returns 值是否 大于 作为 bool 的参数。

public class GreaterThanConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
      if (!(value is string valueText) ||
          !(parameter is string parameterText) ||
          !int.TryParse(valueText, out var intValue) ||
          !int.TryParse(parameterText, out var intParameter))
         return Binding.DoNothing;

      return intValue > intParameter;
   }

   public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      throw new NotImplementedException();
   }
}

在 XAML 中,您可以使用 DataTrigger 绑定到使用转换器的 Text。如果转换器 returns true(意思是值大于参数),则设置特定颜色。

<DataGridTextColumn.ElementStyle>
   <Style TargetType="{x:Type TextBlock}">
      <Style.Triggers>
         <Trigger Property="Text" Value="0">
            <Setter Property="Background" Value="LightGreen"/>
         </Trigger>
         <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Self}, Converter={StaticResource GreaterThanConverter}, ConverterParameter=0}" Value="True">
            <Setter Property="Background" Value="Red"/>
         </DataTrigger>
      </Style.Triggers>
   </Style>
</DataGridTextColumn.ElementStyle>

确保在任何资源字典中实例化转换器,例如在DataGrid上,否则会报资源无法解析的错误。

<DataGrid>
   <DataGrid.Resources>
      <local:GreaterThanConverter x:Key="GreaterThanConverter"/>
   </DataGrid.Resources>
   <!-- ...other markup. -->
</DataGrid>

还要确保您在 XAML 文件中定义了 local 命名空间。

xmlns:local="clr-namespace:MyWpfApp.MyNamespace"

在您的情况下,最好将完整的逻辑移至转换器以选择颜色。然后,您应该删除所有触发器并将 DataGridCell.Background 直接绑定到 Missing 的当前值。 您也可以使用 DataGridTextColumn.CellStyle 代替 EditStyle

<DataGrid>
  <DataGrid.Resources>
    <IntegerToBrushConverter x:Key="IntegerToBrushConverter" />
  </DataGrid.Resources>

  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Missing}">
      <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
          <Setter Property="Background" 
                  Value="{Binding Missing, Converter={StaticResource IntegerToBrushConverter}}" />
        </Style>
      </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>
  </DataGrid.Columns>
<DataGrid>

IntegerToBrushConverter.cs

class IntegerToBrushConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    switch (value)
    {
      case int numericValue when numericValue == 0: return Brushes.LightGreen; 
      case int numericValue when numericValue > 0: return Brushes.Red; 
      case int numericValue when numericValue > 1 && numericValue < 5: return Brushes.Blue; 
      default: return Brushes.Yellow;
    }
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    => throw new NotSupportedException();
}