根据值更改DataGrid单元格颜色

CPM*_*CPM 63 c# wpf xaml datagrid colors

我有一个WPF数据网格,我想根据值不同的单元格颜色.我的xaml下面有代码

Style TargetType="DataGridCell"
Run Code Online (Sandbox Code Playgroud)

但是选择所有行而不是选择一个单元格?我错过了什么?

H.B*_*.B. 135

如果您尝试设置DataGrid.CellStyleDataContext将是行,那么如果您想根据一个单元格更改颜色,在特定列中最容易这样做,特别是因为列可以有不同的内容,如TextBlocks,ComboBoxes和CheckBoxes .以下是设置所有小区浅绿色,其中的一个例子NameJohn:

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <Trigger Property="Text" Value="John">
                    <Setter Property="Background" Value="LightGreen"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

截图


您还可以使用a ValueConverter来更改颜色.

public class NameToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string input = value as string;
        switch (input)
        {
            case "John":
                return Brushes.LightGreen;
            default:
                return DependencyProperty.UnsetValue;
        }
    }

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

用法:

<Window.Resources>
    <local:NameToBrushConverter x:Key="NameToBrushConverter"/>
</Window.Resources>
...
<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background" Value="{Binding Name, Converter={StaticResource NameToBrushConverter}}"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

另一种选择是直接将Background属性绑定到返回相应彩色画笔的属性.您必须在颜色所依赖的属性的setter中触发属性更改通知.

例如

public string Name
{
    get { return _name; }
    set
    {
        if (_name != value)
        {
            _name = value;
            OnPropertyChanged("Name");
            OnPropertyChanged("NameBrush");
        }
    }
}

public Brush NameBrush
{
    get
    {
        switch (Name)
        {
            case "John":
                return Brushes.LightGreen;
            default:
                break;
        }

        return Brushes.Transparent;
    }
}
Run Code Online (Sandbox Code Playgroud)


unw*_*bow 20

如果您需要使用一定数量的列,HB的方式是最好的.但是如果你不知道在运行之前你要处理多少列,那么下面的代码[read:hack]将会起作用.我不确定是否有更好的解决方案,列数不明.我花了两天的时间来完成它,所以无论如何我都坚持下去.

C#

public class ValueToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int input;
        try
        {
            DataGridCell dgc = (DataGridCell)value;
            System.Data.DataRowView rowView = (System.Data.DataRowView)dgc.DataContext;
            input = (int)rowView.Row.ItemArray[dgc.Column.DisplayIndex];
        }
        catch (InvalidCastException e)
        {
            return DependencyProperty.UnsetValue;
        }
        switch (input)
        {
            case 1: return Brushes.Red;
            case 2: return Brushes.White;
            case 3: return Brushes.Blue;
            default: return DependencyProperty.UnsetValue;
        }
    }

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

XAML

<UserControl.Resources>
    <conv: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 x:Name="dataGrid" CellStyle="{StaticResource CellStyle}">
</DataGrid>
Run Code Online (Sandbox Code Playgroud)