2009-10-02 7 views
7

Comment changer la couleur des lignes de données de données silverlight ?!C# Silverlight Datagrid - Changement de couleur de ligne

J'ai essayé cela, mais il ne semble pas fonctionner comme je veux qu'il ... lignes au hasard soient colorés de façon incorrecte:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      var c = e.Row.DataContext as Job; 
      if (c != null && c.Status.Contains("complete")) 
       e.Row.Background = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Background = new SolidColorBrush(Colors.Red); 
     } 
+0

je ne pense pas que ses possible d'obtenir des lignes de couleur au hasard avec ce code - mais il est possible que si vous ne définissez pas toujours une couleur de fond - voir ma réponse ci-dessous –

Répondre

6

Microsoft Documentation:

Pour améliorer les performances, la propriété est EnableRowVirtualization valeur true par défaut. Lorsque la propriété EnableRowVirtualization est définie sur true, le DataGrid n'instancie pas un objet DataGridRow pour chaque élément de données dans la source de données liée. Au lieu de cela, le DataGrid crée des objets DataGridRow seulement quand ils sont nécessaires, et les réutilise autant que peut. Par exemple, le DataGrid crée un objet DataGridRow pour chaque élément de données qui est actuellement en vue et recycle la ligne lorsqu'il affiche la vue .

source: http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

ce qui explique le comportement que vous avez rencontré

le bon (mais pas plus facile j'avoue) être la solution, par conséquent, d'utiliser l'événement UnloadingRow à désinitialiser le style que vous aviez ensemble. La meilleure façon de procéder est de modifier RowStyle sur votre DataGrid.

3

j'étais après:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      DataGridRow row = e.Row; 
      var c = row.DataContext as Job;   
      if (c != null && c.Status.Contains("omplete")) 
       e.Row.Foreground = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Foreground = new SolidColorBrush(Colors.Red); 
     } 
+0

Si cela fonctionne pour vous, vous devriez l'accepter comme réponse. – kersny

+0

Je ne vois pas comment cela corrige les choses. À moins qu'un problème clair puisse être présenté, la solution donnée à cette question entière devrait être supprimée. – AnthonyWJones

+0

@Kersny ne peut pas accepter votre propre réponse pour 2 jours. @AnthonyWJones, les gens comme vous m'énerver, grandir. – Goober

5

J'ai eu ce même problème et je l'ai compris après avoir fait un test minimal et un raisonnement déductif!

Fondamentalement, la solution est de TOUJOURS assurez-vous de définir la couleur d'arrière-plan (ou tout style en fait). N'assumez aucune valeur par défaut pour le style de ligne. Je supposais un défaut de blanc - ce qui est une hypothèse raisonnable mais n'était pas réellement le cas.

Plus de détails:

Il semble que le temps d'exécution réutilise instances de la classe de ligne lors du rendu plusieurs lignes. Je n'ai pas vérifié cela du tout, mais à en juger par les symptômes, il semble que cela doive se produire.

Je n'avais qu'une ou deux lignes qui devaient être colorées différemment. Je voyais des lignes colorées au hasard en faisant défiler de haut en bas.

Voici ma classe de test que j'ai faite. Chaque cinquième rangée est censée être rouge et italique.

Vous verrez quelques lignes commentées (qui définissent un arrière-plan non-italique et blanc par défaut). Avec ceux-ci commenté - si vous faites défiler de haut en bas, vous verrez beaucoup de rouge !! C'est parce que les objets de la ligne sont en train d'être réutilisés. Si vous réduisez la fenêtre et que vous la maximisez, une partie du blanc reviendra. Probablement garbage collector ramassant des rangs il ne pense pas que vous aurez besoin de plus après avoir fait la fenêtre plus petite.

Comme je l'ai dit ci-dessus, la solution consiste à toujours spécifier des styles pour les valeurs par défaut et ne pas assumer les valeurs par défaut.

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person() 
     { 
      FirstName = "John", 
      LastName = "Smith", 
      ID = x, 
      Delinquent = (x % 5 == 0)  // every fifth person is 'delinquent' 
     }); 
    } 

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var person = (Person)e.Row.DataContext; 

     if (person.Delinquent) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      // e.Row.Background = new SolidColorBrush(Colors.Green); 
      // e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      // e.Row.FontStyle = FontStyles.Normal; 
     } 

    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int ID { get; set; } 
     public bool Delinquent { get; set; } 
    } 
} 
0

Cela nécessite beaucoup de xaml, mais vous pouvez simplement copier cela à partir de here et y changer quelques styles.

De même, si vous devez modifier la couleur de ligne en fonction des données de ligne, vous pouvez ajouter une liaison dans la propriété Style à une propriété Brush de vos données.

Ils ont ouvert Reflector et ont pris generic.xaml pour le DataGrid à partir de System.Windows.Controls.Data.dll, puis ont écrit un nouveau xaml pour le modifier.

0

Cela fonctionne pour moi. =)

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var row = e.Row.GetIndex(); 
     if (row % 2 == 0) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      e.Row.Background = new SolidColorBrush(Colors.Green); 
      e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      e.Row.FontStyle = FontStyles.Normal; 
     } 
    } 
Questions connexes