2014-10-15 12 views
0

У меня есть 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 это не изящное решение, и его следует избегать. Но это единственный способ сделать эту работу.

Есть ли лучший способ изменить цвет фона ячейки? Могу ли я сделать это с помощью триггеров, не зная значений во время разработки? Если да, то как?

+0

Какова логика определения цвета? – clcto

+0

Пользователь вводит значение, а затем эти значения окрашиваются в datagrid – RBasniak

+2

Вам не нужно отказываться от красивой функции «Виртуализация», устанавливая «VirtualizingMode» на «Standard». Вы можете обработать событие «LoadingRow», чтобы обновить фон, а также обработать «UnloadingRow», чтобы восстановить фон до некоторого значения по умолчанию. Я только что протестировал его на «DataGridRow» (а не на «DataGridCell»), но это доказывает, что это очень перспективно. Виртуализация имеет свой собственный способ решения этой проблемы. –

ответ

1

DataGrid имеет VirtualizationMode по умолчанию для Recycling что означает, что будет повторно использовать DataCell что сгенерированный для повышения производительности. Ему не нужно будет создавать n раз элементов управления.

Добавьте это в DataGrid

VirtualizingStackPanel.VirtualizationMode="Standard" 

Имейте в виду, что это будет влиять на производительность и WPF будет создавать п раз контроля.

Смежные вопросы