Domanda

Ho un DataGrid con colonne generate dinamiche e ho bisogno di cambiare lo stile delle celle i cui valori sono cambiati dopo alcune manipolazioni.

L'elementoSource per DataGrid è definito come List<MyTableRow>, dove

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

    // getters and setters here
}
.

Le colonne DataGrid sono generate con il seguente codice:

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];
}
.

DATEGRID DEI DARAGRID ASSEGNA

Il problema sorge quando provo a evidenziare cellule (grassetto testo o sfondo colorato) i cui valori nell'oggeource sono cambiati. Questo sto stò in cui la mia domanda si divide in due:

    .
  1. C'è qualche modo "incorporato" per fare smth con cellule modificate? (forse con ObservableColletion o smth altrimenti)
  2. Se no, come posso evidenziare le celle separate basate sui loro indici o sui loro valori
  3. Ho provato a farlo con stili xaml e / o trigger, ma è risultato che non so quale valore accecante dovrei passare al convertitore

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

    altre soluzioni trovate su così o hanno lo stesso "problema" con vincolo o semplicemente non lavorare. Cosa posso fare per evidenziare Just one cella e non intera riga / colonna? Posso cambiare elementoSource, MyTableRow Campi e / o codice di generazione delle colonne, se necessario

    Qualcuno può aiutarmi a aiutarmi? Sono stati pochi giorni da quando ho bloccato con questo problema


    .

    Aggiornamento Trovato Soluzione


    .
È stato utile?

Soluzione

finalmente scopri come fare ciò che voglio.La soluzione è un po '"sporca", ma funziona bene per me. Ho aggiunto il carattere dello spazio senza rottura a ogni cella che ho bisogno di evidenziare

private const string NBSP = "\u00A0"

Tutto ciò che è rimasto da fare dopo è quello di creare il convertitore di valore.Quindi ho aggiunto MultiBinding nel mio 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 definito come:

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();
        }
    }
.

Spero che questo aiuti qualcuno!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top