如果值大于或等于,则更改单元格的背景颜色
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();
}
如果 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();
}