【问题标题】:Changing background color of cells if a value is greater than or equal to如果值大于或等于,则更改单元格的背景颜色
【发布时间】:2021-11-20 12:06:36
【问题描述】:

如果我的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();
    }
}

我该如何解决这个问题?

【问题讨论】:

    标签: c# wpf xaml data-binding datagrid


    【解决方案1】:

    您的转换器不会检查该值是否大于零,而是检查它是否小于一。您可以简化转换器并同时使其更强大。期望 大于 值作为转换器的参数。尽管您可以在 XAML 中将 int 指定为参数,但将值指定为 string 更具可读性,如下面使用转换器时将介绍的那样。此转换器将string 的值和参数解析为int,并返回该值是否大于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。如果转换器返回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"
    

    【讨论】:

    • 资源“转换器”无法解决,我尝试实现了几次不同的东西,但似乎真的找不到原因
    • @Gerken 当然,您必须首先在资源字典中创建转换器的实例才能使用它。查看编辑。
    • "未找到类型 'GreaterThanConverter'。确认您没有丢失程序集引用并且所有引用的程序集都已构建。"我是在 app.xaml 中遗漏了一些东西,还是我不应该在视图的 xaml.cs 中写这个,还是我在 xml 中遗漏了一些带有 xmln = name 的东西?我不知道该怎么办
    • 我修复了这个错误,但“XML 命名空间 'schemas.microsoft.com/winfx/2006/xaml/presentation' 中不存在标签 'GreaterThanConverter'。
    • @Gerken 抱歉,我忘记为转换器指定 XAML 命名空间。查看更新。为转换器添加命名空间前缀,并为转换器所在的命名空间添加命名空间声明。
    【解决方案2】:

    在您的情况下,最好将完整的逻辑移动到转换器来选择颜色。然后,您应该删除所有触发器并将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();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2013-04-12
      • 2021-10-31
      相关资源
      最近更新 更多