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

问题描述 投票:0回答:1

我有一个数据网格,如果单元格文本超过32个字符,我想让单元格变红。

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

我的XAML如下

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

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

DataGridView1.DataContext = dt.DefaultView;

UPDATE

使用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中读取,它可以有任意数量的列/名称,所以我不能对这些列进行数据绑定

有任何想法吗?

c# wpf colors datagrid cell
1个回答
1
投票

Manual defined colums

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

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>

Auto generated colums

如果要使用自动生成的列,则必须使用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>
© www.soinside.com 2019 - 2024. All rights reserved.