我想要根据datagrid里的cell值,来给该cell一个背景色。
一般做法是,建一个class,列举数据的property,把数据collection绑定到datagrid的itemsource以后,再用datatrigger来设置background。
但是由于我的列表,从第四列开始,列的信息是不固定的。
即:①列数不固定
②列的名字也不固定
因此,我没有建立数据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以后,颜色会移位(感觉无法跟着滚动条走)
③当数据列数上千条时,转页会很卡(这是另外的问题需要解决)
如果datagrid实现比较困难的话,有没有其他usercontrol或方式来实现列不固定的情况下,设置cell的背景色?
需要package的license发布免费,实现起来没那么麻烦的?