wpf datagrid如何根据cell的值来设置cell背景色

背景

我想要根据datagrid里的cell值,来给该cell一个背景色。

一般做法是,建一个class,列举数据的property,把数据collection绑定到datagrid的itemsource以后,再用datatrigger来设置background。

但是由于我的列表,从第四列开始,列的信息是不固定的。
即:①列数不固定
②列的名字也不固定

img

因此,我没有建立数据class,而是将数据纳入到datatable以后,再bind到datagrid上。

//viewModel
var dtCalcResult = new DataTable();
DtView = dtCalcResult.AsDataView();

//xaml
Name="dtgdTest" 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch"
            Margin="10" 
            ItemsSource="{Binding DtView}"
            RowHeight="16"
            FrozenColumnCount="3"
            ColumnHeaderHeight="24"
            EnableRowVirtualization="True"
            EnableColumnVirtualization="True"
            Loaded="dtgdTest_Load"
            >

那我该如何通过cell的值来赋予背景色呢?

我的解答思路和尝试过的方法

通过GetCellContent()来获取cell的值,根据值的判断来设置背景色。

                //获取行数
                var rowCount = targetDataGrid.Items.Count;
                for (int i = 0; i < rowCount; ++i)
                {
                    // 获取行object
                    var row = targetDataGrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
                    // 无法获取
                    if (row == null)
                    {
                        // 通过scrollIntoView()滚动到该行
                        targetDataGrid.UpdateLayout();
                        targetDataGrid.ScrollIntoView(targetDataGrid.Items[i]);
                        // 再次获取object
                        row = targetDataGrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
                    }

                    // 获取列数
                    var columnCount = targetDataGrid.Columns.Count;
                    for (int j = 0; j < columnCount; ++j)
                    {
                        // 获取cell的object
                        var elem = targetDataGrid.Columns[j].GetCellContent(row);
                        // 无法获取
                        if (elem == null)
                        {
                            // 通过scrollIntoView()滚动到该列
                            targetDataGrid.UpdateLayout();
                            targetDataGrid.ScrollIntoView(targetDataGrid.Columns[j]);
                            // 再次获取object
                            elem = targetDataGrid.Columns[j].GetCellContent(row);
                        }

                        //设定背景色
                        DataGridCell cell = elem.Parent as DataGridCell;
                        string colHeader = targetDataGrid.Columns[j].Header.ToString();
                        string cellData = _viewModel.DictColNameAndValues[colHeader][i];
                        //float actHour = _viewModel.DictValueLists_ActHour[colHeader][i];

                        if (8 < float.Parse(cellData))
                        {
                            cell.Background = Brushes.Green;

                        }
                        else
                        {
                            cell.Background = Brushes.White;
                        }

运行结果

①报错,scrollIntoView()以后,依旧无法获取cell的值,为null
②没有报错的列数,背景色不准确
③滚动条scroll以后,颜色会移位(感觉无法跟着滚动条走)
③当数据列数上千条时,转页会很卡(这是另外的问题需要解决)

img

其他

如果datagrid实现比较困难的话,有没有其他usercontrol或方式来实现列不固定的情况下,设置cell的背景色?
需要package的license发布免费,实现起来没那么麻烦的?

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^