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

时间:2015-08-18 17:23:47

标签: c# wpf wpfdatagrid

我有以下简化结构:

    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。我想将这些信息呈现为DataGrids,所以我所做的是使用ItemsControl绑定到两个集合,最后在DataTemplate中我将DataGrid的ItemSource绑定到每个DataTable的DefaultViews。

这很有效,但是还有一个问题,我需要更改单元格的背景颜色,理想情况下,每个单元格应该由一些文本和背景组成,并绑定到HighLightedValue的相应值。但是,我似乎无法找到实现这一目标的方法。

如果有更方便的方式,我不一定需要将表格表示为DataTables。

如何在每个列的背景和文本中绑定每个单元格的值?

1 个答案:

答案 0 :(得分:0)

它不具有约束力,但您可以通过逻辑创建自己的自定义列来设置背景颜色并替换自动生成的颜色。

的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是你想要绑定的对象。