Pregunta

Tengo un DataGrid con columnas generadas dinámicas y necesito cambiar el estilo de las células cuyos valores han cambiado después de algunas manipulaciones.

El artículoSource para DataGrid se define como List<MyTableRow>, donde

public class MyTableRow
{
    private string[] _values;
    private string _rowHeader;

    // getters and setters here
}

Las columnas DATAGRID se generan con el siguiente código:

for (int i = 0; i < source[0].Values.Length; i++)
{
    var col = new DataGridTextColumn();
    var binding = new Binding("Values[" + i + "]");
    col.Binding = binding;
    col.CanUserSort = false;
    this.dataGrid.Columns.Add(col);
    this.dataGrid.Columns[i].Header = columnNames[i];
}

DataGrid resultante se parece a este

El problema surge cuando intento resaltar (texto en negrita o fondo de colores) células cuyos valores en los elementos han cambiado. Esto me apunta a donde mi pregunta se divide en dos:

  1. ¿Hay alguna forma de "incorporada" para hacer algo con las células cambiadas? (Tal vez con ObservableColletion o smth else)
  2. Si no, ¿cómo puedo resaltar las celdas separadas basadas en sus índices o sus valores
  3. Intenté hacer esto con los estilos XAML y / o desencadenantes, pero resultó que no sé qué valor cegador debería pasar al convertidor

    <Style TargetType="TextBlock">
        <Setter Property="Background" 
                Value="{Binding <!-- some proper binding here -->, 
                        Converter={StaticResource ValueToBrushConverter}}"/>
    </Style>
    

    Otras soluciones que se encuentran en los que tienen el mismo "problema" con la unión o simplemente no funcionen. ¿Qué puedo hacer para resaltar solo una celda y no toda la fila / columna? Puedo cambiar los elementos, los campos de GeneracodicCode Campos y / o el código de generación de columnas, si es necesario

    ¿Puede alguien por favor ayudarme? Han pasado unos días desde que me quedé con este problema


    update se encuentra la solución


¿Fue útil?

Solución

Finalmente descubrir cómo hacer lo que quiero.La solución es un poco "sucia", pero funciona bien para mí. Añadí carácter de espacio de no ruptura a cada celda que necesito para resaltar

private const string NBSP = "\u00A0"

Todo lo que queda por hacer después de eso es crear un convertidor de valor.Así que agregué MultiBinding en mi XAML:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ValueToBrushMultiConverter}" >
                    <MultiBinding.Bindings>
                        <Binding RelativeSource="{RelativeSource Self}" />
                        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
                    </MultiBinding.Bindings>
                 </MultiBinding
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.CellStyle>

Сonverter definido como:

public class ValueToBrushMultiConverter : IMultiValueConverter
    {
        private const string NBSP = "\u00A0";
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var cell = (DataGridCell)values[0];
            var dgRow = (DataGridRow)values[1];

            var test = (dgRow.Item as TableRow<string, string>).Values[cell.Column.DisplayIndex];

            if (test.Contains(NBSP))
                return System.Windows.Media.Brushes.PaleGreen;
            return DependencyProperty.UnsetValue;           
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

Espero que esto ayude a alguien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top