none
Colorear una celda de un DataGrid en Silverlight RRS feed

  • Pregunta

  • Estoy haciendo unas pruebas con un DataGrid en Silverlight 5, para una aplicación específica, dependiendo de un cálculo, voy a necesitar colorear de amarillo y poner con letra roja, la primera columna de un DataGrid, para ciertos renglones dependiendo del cálculo

    La prueba que hice es:

    private void myDataGrid_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e)
    {
        if (e.Row.GetIndex() == 2)
        {
            Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new Setter(DataGridCell.BackgroundProperty, new SolidColorBrush(Colors.Yellow)));
            style.Setters.Add(new Setter(DataGridCell.ForegroundProperty, new SolidColorBrush(Colors.Red)));
    
            myDataGrid.Columns[0].CellStyle = style;
        }
    }

    Pero cuando hago esto, para todos los renglones me colorea la columna 0, y yo solo quiero en esta prueba, el tercer renglón, cómo puedo hacer para que solo una celda, y no toda la columna se coloree??

    Saludos y gracias

    jueves, 29 de enero de 2015 15:44

Respuestas

  • Ya me salió mi prueba, quedó así:

    En la definición del DataGrid en xaml:

    <sdk:DataGrid.Columns> <sdk:DataGridTemplateColumn Header="PRIORIDAD" Width="80" CanUserSort="true" SortMemberPath="Prioridad" > <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Prioridad, Mode=TwoWay}" HorizontalAlignment="Center" Style="{Binding Color}" Width="80"/> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn>

    ......

    Y en la definición de mi Clase:

    public class ProgramaMTTO : INotifyPropertyChanged
    {
        private int _prioridad;
        public int Prioridad 
        {
            get
            { return _prioridad; }
            set
            {
                _prioridad = value;
                OnPropertyChanged("Prioridad");
            }
        }
        private bool _highlight;
        public bool Highlight
        {
            get
            { return _highlight; }
            set
            {
                _highlight = value;
                OnPropertyChanged("Highlight");
            }
        }
        private Style _color;
        public Style Color
        {
            get
            { return _color; }
            set
            {
                _color = value;
                OnPropertyChanged("Color");
            }
        }
    .....


    Al crear mi Colección:

        public class ProgramaMttos : ObservableCollection<ProgramaMTTO>
        {
            public ProgramaMttos()
            {
                Add(
                    new ProgramaMTTO()
                    {
                        Prioridad = 1,
                        Highlight = false,
    ........
                Add(
                    new ProgramaMTTO()
                    {
                        Prioridad = 2,
                        Highlight = false,
    ........
                Add(
                    new ProgramaMTTO()
                    {
                        Prioridad = 3,
                        Highlight = true,
    ......

    Una vez cargado mi DataGrid:

            private void dgProgramaMTTO_Loaded(object sender, RoutedEventArgs e)
            {
                if (dgProgramaMTTO.ItemsSource != null)
                {
                    foreach (ProgramaMTTO item in dgProgramaMTTO.ItemsSource)
                    {
                        if (item.Highlight == true)
                        {
                            item.Color = HighlightStyle;
                        }
                        else
                        {
                            item.Color = OriginalStyle;
                        }
                    }
                }
            }
    

    Siendo que:

    Style HighlightStyle = new Style(typeof(TextBox));
    Style OriginalStyle = new Style(typeof(TextBox));
    
    HighlightStyle.Setters.Add(new Setter(TextBox.BackgroundProperty, new SolidColorBrush(Colors.Yellow)));
    HighlightStyle.Setters.Add(new Setter(TextBox.ForegroundProperty, new SolidColorBrush(Colors.Red)));
    HighlightStyle.Setters.Add(new Setter(TextBox.TextAlignmentProperty, "Center"));
                
    OriginalStyle.Setters.Add(new Setter(TextBox.TextAlignmentProperty, "Center"));

    así, cada vez que a un elemento de la colección le cambio su propiedad Color, se ve reflejado el cambio en mi DataGrid

    No se porqué no puedo incluir una imagen de cómo se ve mi DataGrid, no me lo permite, me dice que antes deben verificar mi cuenta ¿?

    Por si a alguien le sirve...



    • Editado Rick Sanz viernes, 30 de enero de 2015 16:55
    • Marcado como respuesta Rick Sanz viernes, 30 de enero de 2015 16:57
    viernes, 30 de enero de 2015 16:53

Todas las respuestas

  • Estaba pensando agregar a mi modelo una propiedad que albergue el style para esa columna:

    private Style _color;
    public Style Color
    {
        get
        { return _color; }
        set
        {
            _color = value;
            OnPropertyChanged("Color");
        }
    }

    Y así definir el style que se requiera, por ejemplo:

    Style HighlightCell= new Style(typeof(DataGridCell));
    HighlightCell.Setters.Add(new Setter(DataGridCell.BackgroundProperty, new SolidColorBrush(Colors.Yellow)));
    HighlightCell.Setters.Add(new Setter(DataGridCell.ForegroundProperty, new SolidColorBrush(Colors.Red)));

    Y al crear la instancia, asignar el que le corresponda:

    Color = HighlightCell,

    Luego igual que "bindeo" los datos en mi DataGrid, "bindear" también el style para la columna:

    <sdk:DataGrid.Columns> <sdk:DataGridTemplateColumn Header="PRIORIDAD" Width="80" CanUserSort="true"

    SortMemberPath="Prioridad" CellStyle="{Binding Color}" > <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Prioridad}" HorizontalAlignment="Center" /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> ....


    Pero me marca un error:

    El objeto de tipo 'System.Windows.Data.Binding' no puede convertirse en el tipo 'System.Windows.Style'.

    Alguna idea?


    • Editado Rick Sanz jueves, 29 de enero de 2015 16:45
    jueves, 29 de enero de 2015 16:40
  • Ya me salió mi prueba, quedó así:

    En la definición del DataGrid en xaml:

    <sdk:DataGrid.Columns> <sdk:DataGridTemplateColumn Header="PRIORIDAD" Width="80" CanUserSort="true" SortMemberPath="Prioridad" > <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding Prioridad, Mode=TwoWay}" HorizontalAlignment="Center" Style="{Binding Color}" Width="80"/> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn>

    ......

    Y en la definición de mi Clase:

    public class ProgramaMTTO : INotifyPropertyChanged
    {
        private int _prioridad;
        public int Prioridad 
        {
            get
            { return _prioridad; }
            set
            {
                _prioridad = value;
                OnPropertyChanged("Prioridad");
            }
        }
        private bool _highlight;
        public bool Highlight
        {
            get
            { return _highlight; }
            set
            {
                _highlight = value;
                OnPropertyChanged("Highlight");
            }
        }
        private Style _color;
        public Style Color
        {
            get
            { return _color; }
            set
            {
                _color = value;
                OnPropertyChanged("Color");
            }
        }
    .....


    Al crear mi Colección:

        public class ProgramaMttos : ObservableCollection<ProgramaMTTO>
        {
            public ProgramaMttos()
            {
                Add(
                    new ProgramaMTTO()
                    {
                        Prioridad = 1,
                        Highlight = false,
    ........
                Add(
                    new ProgramaMTTO()
                    {
                        Prioridad = 2,
                        Highlight = false,
    ........
                Add(
                    new ProgramaMTTO()
                    {
                        Prioridad = 3,
                        Highlight = true,
    ......

    Una vez cargado mi DataGrid:

            private void dgProgramaMTTO_Loaded(object sender, RoutedEventArgs e)
            {
                if (dgProgramaMTTO.ItemsSource != null)
                {
                    foreach (ProgramaMTTO item in dgProgramaMTTO.ItemsSource)
                    {
                        if (item.Highlight == true)
                        {
                            item.Color = HighlightStyle;
                        }
                        else
                        {
                            item.Color = OriginalStyle;
                        }
                    }
                }
            }
    

    Siendo que:

    Style HighlightStyle = new Style(typeof(TextBox));
    Style OriginalStyle = new Style(typeof(TextBox));
    
    HighlightStyle.Setters.Add(new Setter(TextBox.BackgroundProperty, new SolidColorBrush(Colors.Yellow)));
    HighlightStyle.Setters.Add(new Setter(TextBox.ForegroundProperty, new SolidColorBrush(Colors.Red)));
    HighlightStyle.Setters.Add(new Setter(TextBox.TextAlignmentProperty, "Center"));
                
    OriginalStyle.Setters.Add(new Setter(TextBox.TextAlignmentProperty, "Center"));

    así, cada vez que a un elemento de la colección le cambio su propiedad Color, se ve reflejado el cambio en mi DataGrid

    No se porqué no puedo incluir una imagen de cómo se ve mi DataGrid, no me lo permite, me dice que antes deben verificar mi cuenta ¿?

    Por si a alguien le sirve...



    • Editado Rick Sanz viernes, 30 de enero de 2015 16:55
    • Marcado como respuesta Rick Sanz viernes, 30 de enero de 2015 16:57
    viernes, 30 de enero de 2015 16:53
  • Te ayudo subiendo la imagen:


    cyndyrdz

    viernes, 30 de enero de 2015 16:59