2009-10-02 6 views
7

Wie ändern Sie die Farbe der silverlight Datagrid Zeilen ?!C# Silverlight Datagrid - Zeilenfarben ändern

Ich habe dies versucht, aber es scheint nicht zu funktionieren, wie ich es will ... Random Zeilen erhalten farbige falsch: Das

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

Ich glaube nicht, seine möglich mit diesem Code zufällig farbigen Zeilen zu bekommen - aber es ist möglich, wenn Sie nicht immer eine Hintergrundfarbe - meine Antwort unten –

Antwort

6

Microsoft Dokumentation:

Um die Leistung zu verbessern, die EnableRowVirtualization Eigenschaft ist Satz standardmäßig auf true. Wenn die EnableRowVirtualization-Eigenschaft auf True festgelegt ist, instanziiert das DataGrid kein DataGridRow-Objekt für jedes Datenelement in der gebundenen Datenquelle. Stattdessen erstellt das DataGrid DataGridRow-Objekte nur, wenn sie benötigt werden, und wiederverwendet sie so viel wie es kann. Beispielsweise erstellt das DataGrid ein DataGridRow-Objekt für jedes Datenelement , das derzeit angezeigt wird, und recycelt die Zeile, wenn es der Ansicht scrollt.

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

dies das Verhalten erklärt Sie

die richtigen erlebt haben (wenn auch nicht leichter zugeben, dass ich) Lösung Wesen, zu damit das UnloadingRow Ereignis verwenden, um die Art, die Sie müssen unset einstellen.

3

Ich war nach:

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

sehen, ob dies für Sie arbeitet, Sie sollten es als Antwort akzeptieren. – kersny

+0

Ich sehe nicht, wie das die Dinge behebt. Wenn kein klares Problem vorliegt, sollte die Lösung für diese ganze Frage gestrichen werden. – AnthonyWJones

+0

@Kersny Kann Ihre eigene Antwort für 2 Tage nicht akzeptieren. @AnthonyWJones, Leute wie du ärger mich, erwachsen werden. – Goober

5

Ich hatte das gleiche Problem und habe es nach einem minimalen Test und einer deduktiven Schlussfolgerung herausgefunden!

Grundsätzlich ist die Lösung zu IMMER sicherstellen, dass Sie die Hintergrundfarbe (oder jede mögliche Art in der Tat). Nehmen Sie keine Standardeinstellungen für das Zeilenstyling an. Ich ging davon aus, ein Standard von Weiß - das ist eine vernünftige Annahme, aber war eigentlich nicht der Fall.

Weitere Details:

Es sieht aus wie die Laufzeitinstanzen der Zeilenklasse wieder verwendet, wenn mehrere Zeilen zu machen. Ich habe das alles noch nicht bestätigt, aber nach den Symptomen zu urteilen, scheint es so zu sein.

Ich hatte nur eine oder zwei Zeilen, die anders gefärbt werden sollten. Ich sah zufällig farbige Reihen beim Scrollen nach oben und unten.

Hier ist meine Testklasse, die ich gemacht habe. Jede fünfte Reihe soll rot und kursiv sein.

Sie werden sehen, dass ein paar Zeilen auskommentiert sind (die einen Standard für nicht-kursiven und weißen Hintergrund festlegen). Mit diesen auskommentiert - wenn Sie nach oben und unten scrollen, werden Sie viel rot sehen !! Dies liegt daran, dass die Zeilenobjekte wiederverwendet werden. Wenn Sie das Fenster verkleinern und dann maximieren, wird etwas Weiß zurückkommen. Wahrscheinlich denkt der Müllsammler, der die Reihen sammelt, dass Sie nicht mehr brauchen werden, nachdem Sie das Fenster kleiner gemacht haben.

Wie oben erwähnt, besteht die Lösung darin, immer Stile für Standardwerte anzugeben und keine Standardwerte anzunehmen.

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

Der beste Weg, dies zu tun ist, den RowStyle auf Ihrem DataGrid zu ändern. Dies erfordert eine Menge von Xaml, aber Sie können das nur von here kopieren und ein paar Stile darin ändern.

Wenn Sie die Zeilenfarbe basierend auf den Zeilendaten ändern müssen, können Sie auch eine Bindung im Stil einer Pinsel-Eigenschaft in Ihren Daten hinzufügen.

Sie öffneten Reflector und nahmen generic.xaml für das DataGrid von System.Windows.Controls.Data.dll und schrieben dann ein neues Xaml, um es zu ändern.

0

Es funktioniert für mich. =)

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