2015-08-18 51 views
0

我有以下簡化結構,以自定義單元格背景:的DataGrid動態列,如何使用數據綁定

public ObservableCollection<ResultModel> results; 
    public class ResultModel { 
     public string FileName{get; set;} 
     public ObservableCollection<TableModel>{get;set;} 
    } 
    public class TableModel { 
     public string TableName{get; set;} 
     public DataTable Table{get; set;} 
    } 
    public class HighlightedValue { 
     public string Value{get; set;} 
     public Brush Background{get; set;} 
    } 

根據文件的數量,我可能有幾個ResultModels。我想將這些信息作爲DataGrids呈現,所以我所做的是使用ItemsControl綁定到兩個集合,最後在DataTemplate中將DataGrid的ItemSource綁定到每個DataTable的DefaultViews。

這很好,但還有一個額外的問題,我需要更改單元格的背景顏色,理想情況下,每個單元格應該由一些文本和背景組成,並綁定到HighLightedValue的相應值。不過,我似乎無法找到實現此目標的方法。

如果有更方便的方法,我不一定需要將表格表示爲DataTables。

如何在每列的背景和文本中綁定每個單元格的值?

回答

0

它不具有約束力,但您可能可以通過創建自己的自定義列來設置背景顏色並替換自動生成的自定義列。

的XAML:

<DataGrid x:Name="grid" AutoGeneratedColumns="grid_AutoGeneratedColumns" /> 

後面的代碼:

private void grid_AutoGeneratedColumns(object sender, EventArgs e) 
     { 
      var columnsToReplace = new List<DataGridTextColumn>(); 

      foreach (var col in this.grid.Columns) 
      { 
       var textCol = col as DataGridTextColumn; 
       if (textCol != null) 
       { 
        columnsToReplace.Add(textCol);     
       } 
      } 

      foreach(var col in columnsToReplace) 
      { 
       this.ReplaceColumn(col, CopyColumn(col)); 
      } 
     } 


     private void ReplaceColumn(DataGridBoundColumn originalColumn, DataGridBoundColumn newColumn) 
     { 
      this.grid.Columns.Add(newColumn); 

      this.grid.Columns.Remove(originalColumn); 
     } 
     private DataGridTextColumn CopyColumn(DataGridTextColumn originalColumn) 
     { 
      var newCol = new DataGridTextColumnEx(); 

      newCol.Binding = originalColumn.Binding; 
      newCol.Header = originalColumn.Header; 

      return newCol; 
     } 

自定義列:

class DataGridTextColumnEx : DataGridTextColumn 
     { 
      protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
      { 
       var textBlock = base.GenerateElement(cell, dataItem) as TextBlock; 

       //Probably use dataItem to set color 
       textBlock.Background = Brushes.Red; 

       return textBlock; 
      } 

      protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) 
      { 
       var textBox = base.GenerateEditingElement(cell, dataItem) as TextBox; 

       //Probably use dataItem to set color 
       textBox.Background = Brushes.Blue; 

       return textBox; 
      } 
     } 

在GenerateElement方法,你大概可以設置在如果你想代碼結合。我認爲dataItem是你想要綁定到的對象。

+0

沒錯,但我沒有一個DataGrid,我有一個可變數量的數據網格。這裏最大的問題是,背景的值取決於HighLightedValue對象,所以理想情況下我會將textbox.Background綁定到Background屬性,將textbox.Text屬性綁定到Value。 – user2881881

相關問題