通过 IValueConverter 更改 DataGridCell 的背景颜色

Changing Background Color of DataGridCell via IValueConverter

我正在使用带有动态列的 WPF DataGrid。 colums 和绑定是在代码中生成的,它运行良好。 现在我想根据数据更改 DataGrid 单元格的背景颜色

因此我创建了一个 IValueConverter

    public class ValueToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is DataGridCell dgc)
        {
            var content = dgc.Content;

            var header = dgc.Column.Header;
            var index = dgc.Column.DisplayIndex;



        }
        return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

这样使用:

    <UserControl.Resources>
    <converters:ValueToBrushConverter x:Key="ValueToBrushConverter"/>
    <Style x:Key="CellStyle" TargetType="DataGridCell">
        <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ValueToBrushConverter}}" />
    </Style>
</UserControl.Resources>

            <DataGrid Grid.Row="2" x:Name="PartsGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserSortColumns="True" 
              BorderBrush="Black" Margin="20 10 0 10"
            
              CellStyle="{StaticResource CellStyle}"
              
              VirtualizingPanel.IsContainerVirtualizable="True"      
              VirtualizingPanel.VirtualizationMode="Recycling"
              VirtualizingPanel.IsVirtualizing="True"
              VirtualizingPanel.CacheLengthUnit="Item"
              EnableColumnVirtualization = "True"
              EnableRowVirtualization = "True"
              >
        </DataGrid>
 

不幸的是,我无法获得转换器内部网格单元的显示值。 Header和DisplayIndex是的,但是内容是空的。

那么在 IValueConverter 中获取网格单元值的正确方法是什么?

使用多绑定转换器解决了它:

<Style x:Key="CellStyle" TargetType="DataGridCell">
<Setter Property="Background" >
    <Setter.Value>
        <MultiBinding Converter="{StaticResource ValueToBrushConverterMulti}" >
            <Binding Path="." RelativeSource="{RelativeSource Self}"/>
            <Binding Path="." RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGridColumn}" />
        </MultiBinding>
    </Setter.Value>
</Setter>