2013-11-21 74 views
0

我有一個數組byte[][] colourMapping,我想操縱一個DataGrid,以便它綁定到數組(但不是傳統意義上的,我相信)。我不想在網格中顯示數組的內容,而是想根據數組的值更改特定的單元格背景(我希望單元格本身爲空)。例如,如果colourMapping [0] [0] == 27,那麼我希望數據網格在[0] [0]的單元格具有特定的顏色背景。DataGrid後臺綁定到鋸齒陣列

此外,隨着數組值的變化,我想數據網格的背景相應地改變。

我知道這是一個普遍的問題,但我該怎麼做呢?

更新:

這是我目前有。它填補了與字節自己一個DataGrid(這是我想避免的),似乎並沒有設置背景:

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 

     //mt.BinaryMapping is a byte[][] 
     dataGrid1.ItemsSource = BindingHelper.GetBindable2DViewFromIList<byte>(mt.BinaryMapping); 
    } 

    private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     DataGridTextColumn column = e.Column as DataGridTextColumn; 
     Binding binding = column.Binding as Binding; 
     binding.Path = new PropertyPath(binding.Path.Path + ".Value"); 
    } 
} 

public class Ref<T> 
{ 
    private readonly Func<T> getter; 
    private readonly Action<T> setter; 
    public Ref(Func<T> getter, Action<T> setter) 
    { 
     this.getter = getter; 
     this.setter = setter; 
    } 
    public T Value { get { return getter(); } set { setter(value); } } 
} 

public class BindingHelper 
{ 
    public static DataView GetBindable2DViewFromIList<T>(IList list2d) 
    { 
     DataTable dataTable = new DataTable(); 
     for (int i = 0; i < ((IList)list2d[0]).Count; i++) 
     { 
      dataTable.Columns.Add(i.ToString(), typeof(Ref<T>)); 
     } 
     for (int i = 0; i < list2d.Count; i++) 
     { 
      DataRow dataRow = dataTable.NewRow(); 
      dataTable.Rows.Add(dataRow); 
     } 
     DataView dataView = new DataView(dataTable); 
     for (int i = 0; i < list2d.Count; i++) 
     { 
      for (int j = 0; j < ((IList)list2d[i]).Count; j++) 
      { 
       int a = i; 
       int b = j; 
       Ref<T> refT = new Ref<T>(() => (list2d[a] as IList<T>)[b], z => { (list2d[a] as IList<T>)[b] = z; }); 
       dataView[i][j] = refT; 
      } 
     } 
     return dataView; 
    } 
} 

public class ColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     byte s = (byte)value; 
     if (s == 255) 
     { 
      return Brushes.DeepPink; 
     } 
     else if (s == 237) 
     { 
      return Brushes.Blue; 
     } 
     else 
     { 
      return Brushes.White; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

而且這裏是我的DataGrid,顯示在細胞中的字節(不可取行爲,但管理),並且似乎無法正確設置背景色:

<DataGrid AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" HorizontalAlignment="Left" Margin="6,6,0,0" Name="dataGrid1" 
       VerticalAlignment="Top" HeadersVisibility="None" RowHeaderWidth="0" ColumnHeaderHeight="0" IsReadOnly="True" HorizontalScrollBarVisibility="Disabled" 
       VerticalScrollBarVisibility="Disabled" SelectionMode="Extended" SelectionUnit="Cell"> 
     <DataGrid.CellStyle> 
      <Style TargetType="{x:Type DataGridCell}"> 
       <Setter Property="Background" Value="{Binding Path=Content, Converter={StaticResource ColorConverter}}" /> 
      </Style> 
     </DataGrid.CellStyle> 
    </DataGrid> 
+0

你是否在某個地方開始工作或者您是否要求我們爲您完成這項工作? –

+0

您需要在背景上設置一個DataGrid.CellStyle,其背景值爲 Value = {Binding Path =。 ,轉換器= {StaticResource SomeHexToBrushConverter –

+0

@devhedgehog我已經更新我的問題,我到目前爲止 –

回答

0

可以使用CellFormatting事件來設置背景顏色,而不陣列到電網結合。

對於我的測試,我使用了顏色數組而不是字節。

Color[,] colourMapping = new Color[8,9]; 

public Form1() 
    { 
     InitializeComponent(); 

     for (int i = 0; i < colourMapping.GetLength(0); i++) 
     { 
     for (int j = 0; j < colourMapping.GetLength(1); j++) 
     { 
      colourMapping[i,j] = Color.Beige; 
     } 
     } 

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.RowIndex < colourMapping.GetLength(0) && e.ColumnIndex < colourMapping.GetLength(1)) 
     { 
     e.CellStyle.BackColor = colourMapping[e.RowIndex, e.ColumnIndex]; 
     } 
    } 
+0

我不相信CellFormatting是在WPF中。 –

+0

對不起。錯過了「wpf」標籤。 (原來的問題沒有任何代碼) – Kim