У меня есть Datagrid WPF с переменным количеством столбцов и заполняется во время выполнения с помощью 2D-массива String [] [].Изменение цвета одной ячейки в WPF Datagrid
String[] data = .....;
datagrid.ItemsSource = data;
Мне нужно, чтобы ясность цветов ячеек основывалась на его значениях. Но эти значения определяются пользователем во время выполнения. Большинство примеров, которые я нашел об изменении цветов ячеек, используют триггеры на XAML, и это значение известно во время разработки.
Так я меняю фон ячейки так:
DataGridCell cell = DataGridUtils.GetCell(datagrid, i, j);
cell.Background = new SolidColorBrush(Colors.DarkGreen);
и функция GetCell:
private DataGridCell GetCell(int rowIndex, int colIndex, DataGrid dg)
{
DataGridRow row = dg.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
DataGridCellsPresenter p = GetVisualChild<DataGridCellsPresenter>(row);
DataGridCell cell = p.ItemContainerGenerator.ContainerFromIndex(colIndex) as DataGridCell;
return cell;
}
На первый взгляд, кажется, делает хорошо, я могу видеть ячейка с этим значением в зеленом цвете. Но если я прокручу datagrid полностью вниз, а затем вернусь к клетке в зеленых изменениях, другая случайная ячейка больше, чем все клетки станут зелеными. Если я продолжаю подниматься и опускаться, зеленые клетки постоянно меняются.
Я знаю, это звучит очень странно, но есть только одно место в коде, которое меняет цвета ячеек, и это нажимает кнопку. Я не знаю, как это могло произойти при прокрутке datagrid.
Я где-то читал, что ItemContainerGenerator это не изящное решение, и его следует избегать. Но это единственный способ сделать эту работу.
Есть ли лучший способ изменить цвет фона ячейки? Могу ли я сделать это с помощью триггеров, не зная значений во время разработки? Если да, то как?
Какова логика определения цвета? – clcto
Пользователь вводит значение, а затем эти значения окрашиваются в datagrid – RBasniak
Вам не нужно отказываться от красивой функции «Виртуализация», устанавливая «VirtualizingMode» на «Standard». Вы можете обработать событие «LoadingRow», чтобы обновить фон, а также обработать «UnloadingRow», чтобы восстановить фон до некоторого значения по умолчанию. Я только что протестировал его на «DataGridRow» (а не на «DataGridCell»), но это доказывает, что это очень перспективно. Виртуализация имеет свой собственный способ решения этой проблемы. –