我在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();
}
}
答案 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
-1
或00000000-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>