如何为Datagrid中的第一行设置颜色

Sag*_*b.g 1 c# wpf xaml datagrid mvvm

我在 wpf (mvvm) 项目上有一个数据网格。数据网格排序将添加到集合中的最后一项显示为第一行。我想为第一行着色(以突出显示添加到集合中的新项目)我已经看到了一些关于这种方式的类似问题,但没有一个与我正在寻找的真正相关。我曾尝试使用 IValueConverter,但它似乎不是我的正确路径,因为我需要获取第一行的唯一标识符并更改所有其余行以将其归类为“第一行”。

我的集合中项目的对象模型如下所示:

public class Messages
{
    public string Date {get; set;}
    public string Sender{get; set;}
    public string Content{get; set;}
} 
Run Code Online (Sandbox Code Playgroud)

*编辑忘记添加转换器代码......当然这会将所有行着色为红色,因为我不知道当集合更改时如何影响其他行。

class DateToColorConverter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (Convert.ToDateTime(value) >= DateTime.Now.AddMinutes(-1))
        {
            return "Red";
        }
        else
            return "Yellow";
    }

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

Roh*_*ats 5

您可以使用RelativeSourcewith Modeset toPreviousData来确定 dataGrid 行是否是第一个。对于第一行 PreviousData 将返回 null。

在 ItemContainerStyle 中的 DataGridRow 上应用 DataTrigger:

<DataGrid>
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" Value="LightBlue"/>
            <Style.Triggers>
                <DataTrigger
                  Binding="{Binding RelativeSource={RelativeSource Mode=PreviousData}}"
                  Value="{x:Null}">
                    <Setter Property="Background" Value="Green"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.ItemContainerStyle>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

  • 这是因为 dataGrid 上的虚拟化,它只为可见项目生成容器并处理视图外的容器。在你的情况下,如果你没有处理大量数据,比如 10000 行或其他东西,你可以关闭虚拟化,你就不会看到这个问题。要关闭,只需在 dataGrid 上将 `VirtualizingStackPanel.IsVirtualizing` 设置为 `false` - `&lt;DataGrid VirtualizingStackPanel.IsVirtualizing="False"&gt;`。 (3认同)