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