C#WPF根据数据长度编辑datagrid单元格颜色

时间:2018-08-22 14:01:56

标签: c# wpf colors datagrid cell

我有一个数据网格,如果单元格文本超过32个字符,我想将单元格设为红色。

基于单元格文本是特定文本时,我已经看到了其他解决方案,但是我不确定如何在此处使用这些解决方案

我的XAML如下

<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5"></DataGrid>  

要放入我的数据,请将其读入名为dt的DataTable中,然后执行以下操作。

DataGridView1.DataContext = dt.DefaultView;

更新

使用Daniel W的一些代码。我已经将其部分工作了,我现在只需要最后润色。

通过执行以下操作,我将其用于1列:

  <DataGrid  Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5">
            <DataGrid.Columns>

                <DataGridTextColumn Binding="{Binding Address1}">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="Background" Value="{Binding Address1, Converter={StaticResource brushConverter}}">
                            </Setter>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>  

但这确实弄乱了我的数据表的格式

https://i.gyazo.com/525ce05a30cad36458a6734d6c61a0ff.png

如您所见,我要编辑的“ address1”列未编辑,而是在常规列的左侧添加了一个新列。

现在,我无法定义每个列,因为列名称可以在运行时更改,所以我不知道我将其绑定到什么

我需要一个只能用作模板的解决方案,因为直到我读取csv时,我的列才被定义,csv可以具有任意数量的列/名称,因此我无法将数据绑定到这些列

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

手动定义的列

您可以根据长度使用绑定到前景/背景转换字符串的转换器:

public class LengthToBrush : IValueConverter
{
    private const int _colorBorders = 0;
    private const int _pow = 2;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var stringValue = value as String;
        if (stringValue == null || stringValue.Length <=32) return new SolidColorBrush(Colors.Black);
        return new SolidColorBrush(Colors.Red);
    }

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

将转换器添加到资源中

<Window.Resources>
    <converters:LengthToBrush x:Key="brushConverter"/>
</Window.Resources>

并在列定义中使用它

<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5">
        <DataGrid.Columns>

            <DataGridTextColumn Header="Name" Binding="{Binding Name}" Foreground="{Binding Name, Converter={StaticResource brushConverter}}"/>


        </DataGrid.Columns>
    </DataGrid>

自动生成的列

如果要使用自动生成的列,则必须为DataGridCell使用样式

为此需要一个不同的转换器,如果前景应该为红色,则返回true:

public class LengthToBool : IValueConverter
{
    private const int _colorBorders = 0;
    private const int _pow = 2;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var stringValue = value as String;            
        if (stringValue == null || stringValue.Length > 12) return true;
        return false;
    }

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

可以在xaml文件中定义样式:

<Window.Resources>
    <local:LengthToBool x:Key="lengthConverter"/>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, 
                       Path=Content.Text, Converter={StaticResource lengthConverter}}" Value="True" >
                <Setter Property="Foreground" Value="Red" />
            </DataTrigger>
</Window.Resources>

可以轻松完成数据网格的定义:

    <DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding Collection}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5">

    </DataGrid>