Uma das coisas que mais me irrita fazer é a Graphical User Interface (GUI), perde-se imenso tempo com detalhes da treta e acabamos por não aprender nada de novo. Isto alcança o seu auge quando falamos de DataGrid, vendido como sendo a melhor coisa do mundo, a verdade é que é muito bom sim para demos rápidas, agora quando se quer começar a personalizar começa a dar mais trabalho que benefícios.
Estava aqui a trabalhar numa DataGrid em WPF quando me foi pedido que a cor de cada row fosse condicionada a uma propriedade do objecto que estava a ser bind. Parece simples...pois não é nada trivial e perdi à volta de 3h em pesquisas na internet e a implementar vários exemplos até que cheguei a uma solução que me agradou minimamente e era funcional.
Para o exemplo vamos considerar os seguintes pontos:
Estava aqui a trabalhar numa DataGrid em WPF quando me foi pedido que a cor de cada row fosse condicionada a uma propriedade do objecto que estava a ser bind. Parece simples...pois não é nada trivial e perdi à volta de 3h em pesquisas na internet e a implementar vários exemplos até que cheguei a uma solução que me agradou minimamente e era funcional.
Para o exemplo vamos considerar os seguintes pontos:
- A nossa DataGrid tem o nome de dGrid;
- O tipo do objecto que é bind a cada row é Register;
- A propriedade do objecto que vai ser usada para condicionar a cor da row é a propriedade LK;
private void WindowLoaded(object sender, RoutedEventArgs e){ UpdateRowColor(); } private void UpdateRowColor(){ for (int i = 0; i < dGrid.Items.Count; ++i){ DataGridRow row = GetRow(dGrid, i); if (row.Item is Register){ Register registry = (Register)row.Item; for (int j = 0; j < dGrid.Columns.Count; ++j){ if (registry.LK == "O") GetCell(dGrid, row, j).Background = Brushes.Green; else GetCell(dGrid, row, j).Background = Brushes.Red; } } } } private DataGridRow GetRow(DataGrid dataGrid, int index){ DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index); if (row == null){ dataGrid.ScrollIntoView(dataGrid.Items[index]); dataGrid.UpdateLayout(); row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index); } return row; } private DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column) { if (rowContainer != null){ DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); // try to get the cell but it may possibly be virtualized DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); if (cell == null){ // now try to bring into view and retreive the cell dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]); cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); } return cell; } return null; } private T GetVisualChild<T>(Visual parent) where T : Visual{ T child = default(T); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i){ Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); child = v as T; if (child == null) child = GetVisualChild<T>(v); if (child != null) break; } return child; }
Sem comentários:
Enviar um comentário