具有动态列的数据网格,如何使用数据绑定自定义单元格背景
本文关键字:何使用 数据绑定 自定义 背景 单元格 网格 动态 数据网 数据 | 更新日期: 2023-09-27 18:08:38
我有以下简化的结构:
public ObservableCollection<ResultModel> results;
public class ResultModel {
public string FileName{get; set;}
public ObservableCollection<TableModel>{get;set;}
}
public class TableModel {
public string TableName{get; set;}
public DataTable Table{get; set;}
}
public class HighlightedValue {
public string Value{get; set;}
public Brush Background{get; set;}
}
根据文件的数量,我可能有几个resultmodel。我想把这些信息显示为DataGrid,所以我所做的是使用ItemsControl绑定到两个集合,最后在DataTemplate中,我将DataGrid的ItemSource绑定到每个DataTable的DefaultViews。
这工作得很好,但有一个额外的问题,我需要改变单元格的背景颜色,理想情况下,每个单元格应该由一些文本和背景组成,绑定到HighLightedValue的各自值。然而,我似乎找不到一种方法来实现这一点。
如果有更方便的方法,我不一定需要将表表示为数据表。
如何在每个列的背景和文本中绑定每个单元格的值?
这不是绑定,但您可以创建自己的自定义列,使用逻辑来设置背景色并替换自动生成的列。
Xaml:<DataGrid x:Name="grid" AutoGeneratedColumns="grid_AutoGeneratedColumns" />
背后的代码:
private void grid_AutoGeneratedColumns(object sender, EventArgs e)
{
var columnsToReplace = new List<DataGridTextColumn>();
foreach (var col in this.grid.Columns)
{
var textCol = col as DataGridTextColumn;
if (textCol != null)
{
columnsToReplace.Add(textCol);
}
}
foreach(var col in columnsToReplace)
{
this.ReplaceColumn(col, CopyColumn(col));
}
}
private void ReplaceColumn(DataGridBoundColumn originalColumn, DataGridBoundColumn newColumn)
{
this.grid.Columns.Add(newColumn);
this.grid.Columns.Remove(originalColumn);
}
private DataGridTextColumn CopyColumn(DataGridTextColumn originalColumn)
{
var newCol = new DataGridTextColumnEx();
newCol.Binding = originalColumn.Binding;
newCol.Header = originalColumn.Header;
return newCol;
}
自定义列:
class DataGridTextColumnEx : DataGridTextColumn
{
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var textBlock = base.GenerateElement(cell, dataItem) as TextBlock;
//Probably use dataItem to set color
textBlock.Background = Brushes.Red;
return textBlock;
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
var textBox = base.GenerateEditingElement(cell, dataItem) as TextBox;
//Probably use dataItem to set color
textBox.Background = Brushes.Blue;
return textBox;
}
}
在GenerateElement方法中,如果您愿意,您可能可以在代码中设置绑定。我认为dataItem是你想要绑定的对象