none
Colorear celda de un datagrid RRS feed

  • Pregunta

  • Hola de nuevo

    Tengo un datagrid en el que en una columna se muestra la gravedad de un paciente en un hospital. Este puede ser o leve o grave.

    Quisiera saber si se puede colorear la casilla de un determinado color (por ejemplo azul y rojo) segun esta condicion.

    He probado a recorrer el datagrid completo, pero el programa se cierra. Me temo que no se recorrerlo...

    Uso Visual Studio 2017 y SOLO ventanas WPF, nada de forms.

    • Cambiado Joyce_AC lunes, 24 de abril de 2017 15:57
    domingo, 23 de abril de 2017 5:18

Respuestas

  • No, tal como lo has puesto, el datatrigger está en el Style del DataGrid, por lo tanto el Setter intentaría cambiar la propiedad Background del Datagrid (no de la celda). Y claro, como el DataGrid no tiene la propiedad Background, por eso no te lo reconoce (y si te lo reconociera no funcionaría bien porque estaría cambiando el color de fondo del datagrid y no de la celda).

    El DataTrigger tienes que ponerlo en el estilo de la celda, que más o menos es algo parecido a esto:

    <wpf:DataGrid.CellStyle> 
        <Style TargetType="{x:Type wpf:DataGridCell}">  

    Pero hago énfasis en lo de "más o menos", ya que no me lo sé de memoria. Sugiero buscar algún ejemplo en Internet y copiarlo, adaptándolo a tu formulario.

    • Marcado como respuesta Atchumbakar miércoles, 26 de abril de 2017 1:12
    domingo, 23 de abril de 2017 17:49

Todas las respuestas

  • He probado a recorrer el datagrid completo [...] Uso Visual Studio 2017 y SOLO ventanas WPF

    En WPF no hace falta recorrer el DataGrid para cambiar el color de la casilla. Lo haces con los estilos en el DataBinding desde la parte del XAML. Hay varias formas de conseguirlo, pero una muy típica sería poniendo un DataTrigger en el Style que le tengas asignado a esa casilla:

                    <Style ...El estilo que estés usando...>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Gravedad}" Value="Grave">
                                <Setter Property="Background" Value="Red"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>

    domingo, 23 de abril de 2017 6:59
  • Pero tiene que ser dinamicamente, es decir, si cumple una condición es de un color y si cumple otra, otro
    domingo, 23 de abril de 2017 11:34
  • Eso es precisamente lo que hace la parte donde dice Binding="{Binding Gravedad}" Value="Grave". Eso significa "Examinar la propiedad Gravedad de los datos que aporta el DataBinding, y si el valor es "Grave" entonces aplicar el estilo que viene a continuación.

    Lógicamente la propiedad y su valor los cambiarás por los que realmente tengan los datos que vinculas.

    Y aunque no sea evidente en el ejemplo, puedes añadir más Setters para cambiar más propiedades cuando la Gravedad sea "Grave", y también puedes meter más DataTriggers dentro del mismo Style para aplicar otros estilos ante otros valores de la propiedad (de no cumplirse ninguno, se aplica el estilo que tengas definido como predeterminado, que en tu caso sería "Azul").

    domingo, 23 de abril de 2017 15:09
  • Gracias, no lo sabía. Pero no me reconoce Background:

            <DataGrid ItemsSource="{Binding}" IsReadOnly="True" ColumnWidth ="110" Name="lista" HorizontalAlignment="Left"  Height="600" Margin="308,60,0,0" VerticalAlignment="Top" Width="880" FontSize="10">
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Gravedad}" Value="Grave">
                            <Setter Property="Background" Value="Red"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Gravedad}" Value="Grave">
                            <Setter Property="Background" Value="Blue"/>
                        </DataTrigger>
                    </Style.Triggers>  
                </Style>
            </DataGrid>

    En Property="Background" da error

    domingo, 23 de abril de 2017 17:14
  • No, tal como lo has puesto, el datatrigger está en el Style del DataGrid, por lo tanto el Setter intentaría cambiar la propiedad Background del Datagrid (no de la celda). Y claro, como el DataGrid no tiene la propiedad Background, por eso no te lo reconoce (y si te lo reconociera no funcionaría bien porque estaría cambiando el color de fondo del datagrid y no de la celda).

    El DataTrigger tienes que ponerlo en el estilo de la celda, que más o menos es algo parecido a esto:

    <wpf:DataGrid.CellStyle> 
        <Style TargetType="{x:Type wpf:DataGridCell}">  

    Pero hago énfasis en lo de "más o menos", ya que no me lo sé de memoria. Sugiero buscar algún ejemplo en Internet y copiarlo, adaptándolo a tu formulario.

    • Marcado como respuesta Atchumbakar miércoles, 26 de abril de 2017 1:12
    domingo, 23 de abril de 2017 17:49