Saltar al contenido

Cambiar el color de la celda de DataGrid según los valores

Después de de esta extensa búsqueda de datos solucionamos este inconveniente que tienen muchos los lectores. Te dejamos la solución y deseamos resultarte de mucha ayuda.

Solución:

Si intenta configurar el DataGrid.CellStyle el DataContext será la fila, por lo que si desea cambiar el color en función de una celda, podría ser más fácil hacerlo en columnas específicas, especialmente porque las columnas pueden tener diferentes contenidos, como TextBlocks, ComboBoxes y CheckBoxes. A continuación se muestra un ejemplo de configuración de todas las celdas de color verde claro donde Name es John:


    
        
    

Una captura de pantalla


También puede utilizar un ValueConverter para cambiar el color.

public class NameToBrushConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        string input = value as string;
        switch (input)
        
            case "John":
                return Brushes.LightGreen;
            default:
                return DependencyProperty.UnsetValue;
        
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotSupportedException();
    

Uso:


    

...

    
        
    


Otra opción más es vincular directamente el Background a una propiedad que devuelve el pincel de color respectivo. Tendrá que disparar notificaciones de cambio de propiedad en los establecedores de propiedades de las que depende el color.

p.ej

public string Name

    get  return _name; 
    set
    
        if (_name != value)
        
            _name = value;
            OnPropertyChanged(nameof(Name));
            OnPropertyChanged(nameof(NameBrush));
        
    


public Brush NameBrush

    get
    
        switch (Name)
        
            case "John":
                return Brushes.LightGreen;
            default:
                break;
        

        return Brushes.Transparent;
    

Si necesita hacerlo con un número determinado de columnas, la forma de HB es la mejor. Pero si no sabe con cuántas columnas está tratando hasta el tiempo de ejecución, entonces el siguiente código [read: hack] trabajará. No estoy seguro de si existe una solución mejor con un número desconocido de columnas. Me tomó dos días trabajar en él de vez en cuando para conseguirlo, así que me quedo con él de todos modos.

C#

public class ValueToBrushConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        int input;
        try
        
            DataGridCell dgc = (DataGridCell)value;
            System.Data.DataRowView rowView = (System.Data.DataRowView)dgc.DataContext;
            input = (int)rowView.Row.ItemArray[dgc.Column.DisplayIndex];
        
        catch (InvalidCastException e)
        
            return DependencyProperty.UnsetValue;
        
        switch (input)
        
            case 1: return Brushes.Red;
            case 2: return Brushes.White;
            case 3: return Brushes.Blue;
            default: return DependencyProperty.UnsetValue;
        
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotSupportedException();
    

XAML


    
    



Esto puede serle de ayuda. Sin embargo, no es la cuadrícula de datos de WPF.

Usé DevExpress con un comportamiento ColorFormatter personalizado. No pude encontrar nada en el mercado que hiciera esto fuera de la caja. Esto me tomó unos días desarrollarlo. Mi código adjunto a continuación, espero que esto ayude a alguien.

Editar: utilicé modelos de vista POCO y MVVM, sin embargo, puede cambiar esto para no usar POCO si lo desea.

Ejemplo

Viewmodel.cs

namespace ViewModel

    [POCOViewModel]
    public class Table2DViewModel
    
        public ITable2DView Table2DView  get; set; 

        public DataTable ItemsTable  get; set; 


        public Table2DViewModel()
        
        

        public Table2DViewModel(MainViewModel mainViewModel, ITable2DView table2DView) : base(mainViewModel)
        
            Table2DView = table2DView;   
            CreateTable();
        

        private void CreateTable()
        
            var dt = new DataTable();
            var xAxisStrings = new string[]"X1","X2","X3";
            var yAxisStrings = new string[]"Y1","Y2","Y3";

            //TODO determine your min, max number for your colours
            var minValue = 0;
            var maxValue = 100;
            Table2DView.SetColorFormatter(minValue,maxValue, null);

            //Add the columns
            dt.Columns.Add(" ", typeof(string));
            foreach (var x in xAxisStrings) dt.Columns.Add(x, typeof(double));

            //Add all the values
            double z = 0;
            for (var y = 0; y < yAxisStrings.Length; y++)
            
                var dr = dt.NewRow();
                dr[" "] = yAxisStrings[y];
                for (var x = 0; x < xAxisStrings.Length; x++)
                
                    //TODO put your actual values here!
                    dr[xAxisStrings[x]] = z++; //Add a random values
                
                dt.Rows.Add(dr);
            
            ItemsTable = dt;
        


        public static Table2DViewModel Create(MainViewModel mainViewModel, ITable2DView table2DView)
        
            var factory = ViewModelSource.Factory((MainViewModel mainVm, ITable2DView view) => new Table2DViewModel(mainVm, view));
            return factory(mainViewModel, table2DView);
        
    


IView.cs

namespace Interfaces
    
        public interface ITable2DView
        
            void SetColorFormatter(float minValue, float maxValue, ColorScaleFormat colorScaleFormat);
        
    

View.xaml.cs

namespace View

    public partial class Table2DView : ITable2DView
    
        public Table2DView()
        
            InitializeComponent();
        

        static ColorScaleFormat defaultColorScaleFormat = new ColorScaleFormat
        
            ColorMin = (Color)ColorConverter.ConvertFromString("#FFF8696B"),
            ColorMiddle = (Color)ColorConverter.ConvertFromString("#FFFFEB84"),
            ColorMax = (Color)ColorConverter.ConvertFromString("#FF63BE7B")
        ;

        public void SetColorFormatter(float minValue, float maxValue, ColorScaleFormat colorScaleFormat = null)
        
            if (colorScaleFormat == null) colorScaleFormat = defaultColorScaleFormat;
            ConditionBehavior.MinValue = minValue;
            ConditionBehavior.MaxValue = maxValue;
            ConditionBehavior.ColorScaleFormat = colorScaleFormat;
        
    

DynamicConditionBehavior.cs

namespace Behaviors

    public class DynamicConditionBehavior : Behavior
    
        GridControl Grid => AssociatedObject;

        protected override void OnAttached()
        
            base.OnAttached();
            Grid.ItemsSourceChanged += OnItemsSourceChanged;
        

        protected override void OnDetaching()
        
            Grid.ItemsSourceChanged -= OnItemsSourceChanged;
            base.OnDetaching();
        

        public ColorScaleFormat ColorScaleFormat  get; set;
        public float MinValue  get; set; 
        public float MaxValue  get; set; 

        private void OnItemsSourceChanged(object sender, EventArgs e)
        
            var view = Grid.View as TableView;

            if (view == null) return;

            view.FormatConditions.Clear();

            foreach (var col in Grid.Columns)
            
                view.FormatConditions.Add(new ColorScaleFormatCondition
                
                    MinValue = MinValue,
                    MaxValue = MaxValue,
                    FieldName = col.FieldName,
                    Format = ColorScaleFormat,
                );
            

        
    

Ver.xaml



    
        

        
    

        
        

        
            
            
            
                
            
        
  

Te mostramos reseñas y calificaciones

Puedes amparar nuestra tarea escribiendo un comentario o dejando una puntuación te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *