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
:
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.
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.