具有动态列的数据网格,如何使用数据绑定自定义单元格背景

本文关键字:何使用 数据绑定 自定义 背景 单元格 网格 动态 数据网 数据 | 更新日期: 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是你想要绑定的对象