2016-06-26 19 views
0

Ich habe mehrere DataGrids an DataTables gebunden, die dynamisch mit SQL erstellt werden. Wenn sich DataTable-Datensätze ändern (hinzufügen, ändern, löschen), ändern die DataGridCells ihre Hintergrundfarbe entsprechend (grün = neu, gelb = ändern usw.).WPF: Ändern DataGrid Zelle/Zeile Hintergrundfarbe dynamisch zur Laufzeit

In WinForms änderte ich Datagridview-Hintergrundfarbe mit _RowPostPaint (Code ist sehr vereinfacht):

private void DataGridViewTest_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
{ 
    DataRow row = (this.Rows[e.RowIndex].DataBoundItem as DataRowView).Row; 
    switch (row.RowState) 
    { 
     case DataRowState.Added: 
      myBitmap = new Bitmap(imageList.Images[1]); 
      this[0, e.RowIndex].Style.BackColor = CellChangesColorAdded; 
      break; 
     case DataRowState.Modified: 
      string sValOld = row[0, DataRowVersion.Original].ToString(); 
      string sValNew = row[0].ToString(); 
      if (sValOld != sValNew) 
      { 
       this[0, e.RowIndex].Style.BackColor = CellChangesColorMod; 
      } 
      break; 
     case DataRowState.Deleted: 
      this[0, e.RowIndex].Style.BackColor = CellChangesColorDel; 
      break; 
    } 
} 

Ich will nicht Spalte Abhängigkeiten in XAML wie in countless examples like this codieren, wie sie während der Laufzeit erstellt werden, und ich habe viele DataGrids im Einsatz.

verwenden Versuch DataGrid_CellEditEnding versagt, da es nicht die Änderungen nicht halten auf Sortier etc .:

XAML:

<Window.Resources> 
    <Style x:Key="MyStyle" TargetType="{x:Type DataGridCell}"> 
     <Setter Property="Background" Value="Green" /> 
    </Style> 
</Window.Resources> 
<DataGrid x:Name="dataGrid" Grid.Row="4" Grid.ColumnSpan="6" 
    ItemsSource="{Binding}" 
> 
</DataGrid> 

CS-:

dataGrid.DataContext = dataTable.DefaultView; // Table filled by SQL query 
dataGrid.CellEditEnding += dataGrid_CellEditEnding; 

// Problem: Color changes disappear when user sorts DataGrid 
    private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     if (e.EditAction == DataGridEditAction.Commit) 
     { 
      TextBox tb = e.EditingElement as TextBox; 
      DataGridCell cell = tb.Parent as DataGridCell; 
      // evaluate row changes and change color accordingly 
      //cell.Background = new SolidColorBrush(Colors.Yellow); // set style instead of color 
      cell.Style = (Style)this.Resources["MyStyle"]; // color is changed to green, according to defined style 
     } 
    } 

Dadurch ändert sich die Hintergrundfarbe vollkommen in Ordnung, jedoch wird der Stil beim Sortieren des DataGrid usw. nicht beibehalten.

Wie kann ich sicherstellen, dass Farbänderungen beibehalten werden? Meiner Meinung nach wäre die beste Lösung, DataRows irgendwie an eine Hilfsklasse zu binden und den entsprechenden Stil bei DataTable-Änderungen zurückzugeben. Allerdings habe ich dafür noch kein Beispiel gesehen.

+0

Ich denke, das wird hart sein. Ich kann nicht sehen, dass dies funktioniert, ohne die 'dataTable.DefaultView' in eine Hilfsklasse zu verpacken, die den aktuellen Zustand einer Zelle verwaltet. Meine Vermutung ist, dass das Neuanordnen des DataGrid alle gezeichneten Zellen aktualisiert, und da das DataGrid der einzige wäre, der weiß, wie man eine bestimmte Zelle zeichnet, hätte sie es dann vergessen. Das DataGrid müsste _von den Daten_ wissen, wie die einzelnen Zellen eingefärbt werden. –

+0

@ MarkusHütter Ja, das ist, was ich auch dachte, und ich weiß im Grunde, wie man eine Hilfsklasse für bestimmte Klassen oder hartcodierte XAML verwendet. Ich habe kein Beispiel gesehen, das mit meinem Problem zu tun hat, und bin dabei, herauszufinden, wie man eine Hilfsklasse für meine gebundene DataTable verwendet. – ray

Antwort

1

Der Vollständigkeit halber:

Wenn Sie wirklich die Farbe zur Laufzeit beabsichtigen, zu ändern, abgesehen von MVVM Sie zum Beispiel DataGrid_LoadingRow verwenden können, überprüfen Sie es Datacontext ist (in diesem Fall ein DataRowView) und gehen von dort:

Wenn Sie dies tatsächlich mit MVVM nähern möchten, gehen Sie für this solution.

Verwandte Themen