如何为Datagrid中的第一行设置颜色
How to set color for first row in Datagrid
我在 wpf (mvvm) 项目上有一个数据网格。
数据网格排序显示添加到集合中的最后一项作为第一行。
我想为第一行着色(以突出显示添加到集合中的新项目)
我已经看到一些关于这种方式的类似问题,但其中 none 确实与我正在寻找的内容相关。
我曾尝试使用 IValueConverter,但它对我来说似乎不是正确的路径,因为我需要为第一行获取唯一标识符并更改所有其余行以将其分类为 "First Row" .
我的集合中项目的对象模型如下所示:
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();
}
}
如果您的数据 类 使用某种 Id
字段,您可以做一个简单的解决方案。假设新添加的对象的 Id
为 -1
,或 00000000-0000-0000-0000-000000000000
(成功保存后为 updated/set)。在这种情况下,您可以使用简单的 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>
向您的模型添加一个布尔值,以指示添加的最后一个元素:
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>
您可以使用 RelativeSource
并将 Mode
设置为 PreviousData
来识别 dataGrid 行是否是第一行。对于第一行 PreviousData 将 return 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>
我在 wpf (mvvm) 项目上有一个数据网格。 数据网格排序显示添加到集合中的最后一项作为第一行。 我想为第一行着色(以突出显示添加到集合中的新项目) 我已经看到一些关于这种方式的类似问题,但其中 none 确实与我正在寻找的内容相关。 我曾尝试使用 IValueConverter,但它对我来说似乎不是正确的路径,因为我需要为第一行获取唯一标识符并更改所有其余行以将其分类为 "First Row" .
我的集合中项目的对象模型如下所示:
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();
}
}
如果您的数据 类 使用某种 Id
字段,您可以做一个简单的解决方案。假设新添加的对象的 Id
为 -1
,或 00000000-0000-0000-0000-000000000000
(成功保存后为 updated/set)。在这种情况下,您可以使用简单的 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>
向您的模型添加一个布尔值,以指示添加的最后一个元素:
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>
您可以使用 RelativeSource
并将 Mode
设置为 PreviousData
来识别 dataGrid 行是否是第一行。对于第一行 PreviousData 将 return 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>