WPF DataGrid Style Cell Modifica dopo l'aggiornamento
-
21-12-2019 - |
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];
}
.
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:
- .
- C'è qualche modo "incorporato" per fare smth con cellule modificate? (forse con
ObservableColletion
o smth altrimenti) - Se no, come posso evidenziare le celle separate basate sui loro indici o sui loro valori
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
.
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!