Per prima cosa, non farlo in code-behind. Stai combattendo il quadro con questo modo di fare le cose. WPF è progettato diversamente; devi pensare in termini di come il framework vuole che tu faccia cose. Nel caso di WPF, sono le classi di markup e di markup XAML.
Hai bisogno di due cose per ottenere ciò che si vuole:
- corretta markup XAML per impostare lo stile del DataGrid
- implementazione Un IValueConverter di tradurre il valore del testo nella giusta colore di evidenziazione.
Qui va:
XAML In DataGrid
La prima cosa che voglio fare è definire il codice XAML necessaria per lo stile vostre cellule DataGrid. Ecco come si presenta:
<toolkit:DataGrid.CellStyle>
<Style TargetType="{x:Type toolkit:DataGridCell}">
<Style.Setters>
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource dataGridCellConverter}}" />
</Style.Setters>
</Style>
</toolkit:DataGrid.CellStyle>
Che cosa questo sta facendo è la creazione di un legame con il RelativeSource (la DataGridCell) e dirgli di usare il Content.Text della cella come valore da passare al convertitore (dataGridCellConverter).
IValueConverter
La prossima cosa che serve è un'implementazione IValueConverter per determinare in realtà i colori in base al testo della cella:
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
namespace UserControls.Utility.Converters
{
public class DataGridCellConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return Colors.White.ToString();
if (value.ToString().ToUpper().Contains("CMS")) return "LIME";
return "ORANGE";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Qui, sto solo cercando il testo "CMS" e colorazione della cella di sfondo; se "CMS" non esiste, restituisce invece il colore arancione.
Specificare Risorse
Ora, è necessario aggiungere il markup nella finestra/UserControl per specificare il convertitore come risorsa appropriata:
<UserControl.Resources>
<Converters:DataGridCellConverter x:Key="dataGridCellConverter"/>
</UserControl.Resources>
e che dovrebbe farlo! In bocca al lupo.
+1 - risposta molto dettagliata – David
'Nel caso di WPF, sono le classi di markup XAML + convertitore.' - questa è la tua personale percezione –