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

时间:2015-01-27 13:43:44

标签: c# wpf xaml mvvm datagrid

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

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

public class Messages
{
    public string Date {get; set;}
    public string Sender{get; set;}
    public string Content{get; set;}
} 

*编辑 忘了添加转换器代码...... 当然这会将所有行颜色变为红色,因为我不知道如何在集合发生变化时影响其他行。

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();
    }
}

3 个答案:

答案 0 :(得分:4)

您可以使用 RelativeSource Mode 设置为 PreviousData ,以确定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>

答案 1 :(得分:0)

如果您的数据类使用某种Id字段,则可以执行简单的解决方案。假设新添加的对象具有Id -100000000-0000-0000-0000-000000000000(在成功保存时更新/设置)。在这种情况下,您可以使用简单的DataTrigger来更改这些项目的Background

<DataTemplate DataType="{x:Type YourPrefix:Message}">
    <Border>
        <!--Define your Message UI here-->
        <Border.Style>
            <Style TargetType="{x:Type Border}">
                <Setter Property="Background" Value="{StaticResource YourNormalBrush}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Id}" Value="-1">
                        <Setter Property="Background" Value="{StaticResource YourHighlightBrush}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
    </Border>
</DataTemplate>

答案 2 :(得分:0)

在您的模型中添加一个bool,指示添加的最后一个元素:

    public class Messages
{
    public string Date {get; set;}
    public string Sender{get; set;}
    public string Content{get; set;}
    public string IsNew {get; set;}

} 

并根据该属性设置DataGridRow的样式:

<Window.Resources>       
        <Style x:Key="DataGridRowStyle" TargetType="DataGridRow">
            <Setter Property="Background" Value="Blue"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsNew}" Value="True">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>

            </Style.Triggers>
        </Style>
    </Window.Resources>

在上面的代码中,蓝色将是默认样式,红色代表新行

 <DataGrid ItemsSource="{Binding DataGridItems}" RowStyle="{StaticResource DataGridRowStyle}" AutoGenerateColumns="True">               
        </DataGrid>