private void FillTheDataGrid()
{
List<SomeClass> list = new List<SomeClass>();
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
list.Add(new SomeClass() { DaysOld = DateTime.Now.Add(new TimeSpan(rnd.Next(5), 0, 0, 0)), ID=i});
}
dataGrid.ItemsSource = list;
}
private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => AlterRow(e)));
}
private void AlterRow(DataGridRowEventArgs e)
{
var cell = GetCell(dataGrid, e.Row, 1);
if (cell == null) return;
var item = e.Row.Item as SomeClass;
if (item == null) return;
var value = item.ID;
if (value <= 1) cell.Background = Brushes.Red;
else if (value <= 2) cell.Background = Brushes.Yellow;
else cell.Background = Brushes.Green;
}
public static DataGridRow GetRow(DataGrid grid, int index)
{
var row = grid.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow;
if (row == null)
{
// may be virtualized, bring into view and try again
grid.ScrollIntoView(grid.Items[index]);
row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
}
return row;
}
public static T GetVisualChild<T>(Visual parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
var v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T ?? GetVisualChild<T>(v);
if (child != null)
{
break;
}
}
return child;
}
public static DataGridCell GetCell(DataGrid host, DataGridRow row, int columnIndex)
{
if (row == null) return null;
var presenter = GetVisualChild<DataGridCellsPresenter>(row);
if (presenter == null) return null;
// try to get the cell but it may possibly be virtualized
var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
if (cell == null)
{
// now try to bring into view and retreive the cell
host.ScrollIntoView(row, host.Columns[columnIndex]);
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
}
return cell;
}
字符串
型号:
public class SomeClass
{
public int ID { get; set; }
public DateTime DaysOld { get; set; }
}
3条答案
按热度按时间drnojrws1#
这段代码的作用:首先,处理
LoadingRow
事件,获取行(它具有保存绑定项的Item属性),获取绑定项,进行所有需要的计算,获取需要更改的单元格,最后更改目标单元格的样式。下面是代码(作为项目,我使用了一个带有int
ID
属性的示例对象,用于着色)。C#:
字符串
型号:
型
XAML:
型
mm5n2pyu2#
我也遇到了同样的问题,最后我找到了答案,它比我想的要容易,下面是代码来改变单元格的颜色:
字符串
nwnhqdif3#
根据DataGridCell中的内容,您可以创建绑定到颜色或使用触发器的DataTemplate
字符串