我想设置一个网格,我在那里做列排序,但我想做斑马条纹,而不是每隔一行或每x行,我想它基于前一行的值。即包含0的所有行都有一个蓝色的背景,下一个值将有一个白色的背景,下一个值将是蓝色等...基于前一行设置DataGrid背景颜色
我的问题是,我似乎无法找到在哪里实际上做背景颜色的设置。我使用的是自定义分类器,在重新排列列表并设置数据源之后,我尝试将它设置在那里,但似乎在设置数据源时,这些行还不存在。我尝试使用DataContextChanged,但该事件似乎并没有被解雇。
这是我现在拥有的。
namespace Foo.Bar
{
public partial class FooBar
{
List<Bla> ResultList { get; set; }
SolidColorBrush stripeOneColor = new SolidColorBrush(Colors.Gold);
SolidColorBrush stripeTwoColor = new SolidColorBrush(Colors.White);
//*********************************************************************************************
public Consistency()
{
InitializeComponent();
}
//*********************************************************************************************
override protected void PopulateTabWithData()
{
ResultList = GetBlas();
SortAndGroup("Source");
}
//*********************************************************************************************
private void SortAndGroup(string colName)
{
IOrderedEnumerable <Bla> ordered = null;
switch (colName)
{
case "Source":
case "ID":
ordered = ResultList.OrderBy(r => r.Source).ThenBy(r => r.ID);
break;
case "Name":
ordered = ResultList.OrderBy(r => r.Source).ThenBy(r => r.Name);
break;
case "Message":
ordered = ResultList.OrderBy(r => r.Message);
break;
default:
throw new Exception(colName);
}
ResultList = ordered.ThenBy(r => r.Source).ThenBy(r => r.ID).ToList(); // tie-breakers
consistencyDataGrid.ItemsSource = null;
consistencyDataGrid.ItemsSource = ResultList;
ColorRows();
}
//*********************************************************************************************
private void consistencyDataGrid_Sorting(object sender, System.Windows.Controls.DataGridSortingEventArgs e)
{
SortAndGroup(e.Column.Header.ToString());
e.Handled = true;
}
private void ColorRows()
{
for (var i = 0; i < ResultList.Count; i++)
{
var currentItem = ResultList[i];
var row = myDataGrid.ItemContainerGenerator.ContainerFromItem(currentItem) as DataGridRow;
if (row == null)
{
continue;
}
if (i > 0)
{
var previousItem = ResultList[i - 1];
var previousRow = myDataGrid.ItemContainerGenerator.ContainerFromItem(previousItem) as DataGridRow;
if (currentItem.Source == previousItem.Source)
{
row.Background = previousRow.Background;
}
else
{
if (previousRow.Background == stripeOneColor)
{
row.Background = stripeTwoColor;
}
else
{
row.Background = stripeOneColor;
}
}
}
else
{
row.Background = stripeOneColor;
}
}
}
}
}
}
如果你的rowcolor是基于任何行值,你可以简单地使用单元格样式来设置你的行背景颜色 – blindmeis 2012-04-02 17:34:22
在这种情况下,我不在乎单元格/行的值是多少,我只关心它是否有差异来自上一个单元格/行。所以我真正想要的是条纹,而不是基于价值的着色。 – Zipper 2012-04-02 17:55:52
然后解决问题,因为您声明“我希望它基于单元格的值”。如果你想为单元格或行着色,请清楚。 – Paparazzi 2012-04-02 18:16:36