2015-12-17 6 views
0

Как мы добавляем цвет для ячейки программно в сетке данных WPF? Я могу добавить цвет к строке мудрый, но я хочу добавить цвет в ячейку из кода позади. Пожалуйста, укажите код для этого?Раскраска ячеек WPF Datagrid

ответ

1

Что делает этот код: сначала вы обрабатываете событие LoadingRow, получаете строку (она имеет свойство Item, которое содержит связанный элемент), получает связанный элемент, выполняет все необходимые вычисления, получает ячейку, в которой вы нуждаетесь, изменить и, наконец, изменить стиль целевой ячейки.

Вот код (в качестве пункта я использую объект выборки с ИНТ ID свойством, что я использую для окраски) .:

C#:

private void FillTheDataGrid() 
{ 
    List<SomeClass> list = new List<SomeClass>(); 
    Random rnd = new Random(); 
    for (int i = 0; i < 10; i++) 
    {   
     list.Add(new SomeClass() { DaysOld = DateTime.Now.Add(new TimeSpan(rnd.Next(5), 0, 0, 0)), ID=i}); 
    } 
    dataGrid.ItemsSource = list; 
} 

private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => AlterRow(e))); 
} 

private void AlterRow(DataGridRowEventArgs e) 
{ 
    var cell = GetCell(dataGrid, e.Row, 1); 
    if (cell == null) return; 

    var item = e.Row.Item as SomeClass; 
    if (item == null) return; 

    var value = item.ID; 

    if (value <= 1) cell.Background = Brushes.Red; 
    else if (value <= 2) cell.Background = Brushes.Yellow; 
    else cell.Background = Brushes.Green; 
} 

public static DataGridRow GetRow(DataGrid grid, int index) 
{ 
    var row = grid.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow; 

    if (row == null) 
    { 
     // may be virtualized, bring into view and try again 
     grid.ScrollIntoView(grid.Items[index]); 
     row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
    } 
    return row; 
} 

public static T GetVisualChild<T>(Visual parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     var v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T ?? GetVisualChild<T>(v); 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
} 

public static DataGridCell GetCell(DataGrid host, DataGridRow row, int columnIndex) 
{ 
    if (row == null) return null; 

    var presenter = GetVisualChild<DataGridCellsPresenter>(row); 
    if (presenter == null) return null; 

    // try to get the cell but it may possibly be virtualized 
    var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); 
    if (cell == null) 
    { 
     // now try to bring into view and retreive the cell 
     host.ScrollIntoView(row, host.Columns[columnIndex]); 
     cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); 
    } 
    return cell; 
} 

Модель:

public class SomeClass 
{ 
    public int ID { get; set; } 
    public DateTime DaysOld { get; set; } 
} 

XAML:

<DataGrid Name="dataGrid" AutoGenerateColumns="True" LoadingRow="dataGrid_LoadingRow"/> 
+0

@RintoAntony Если мой ответ поможет вам, можно пометить его как ответ для упрощения поиска других людей. – StepUp

0

В зависимости от того, что там в вашем DataGridCell вы можете создать DataTemplate, который связывается с цветом или использовать триггер

<DataTemplate DataType="{x:Type cell:MyCellObject}"> 
    <TextBlock TextAlignment="Center" Text="{Binding Text}"> 
     <TextBlock.Style> 
      <Style TargetType="TextBlock"> 
       <Setter Property="Background" Value="{Binding MyBackground}" /> 
       <Setter Property="Foreground" Value="Black" /> 
       <Setter Property="Padding" Value="0" /> 

       <Style.Triggers>  
        <DataTrigger Binding="{Binding MyBool}" Value="True"> 
         <Setter Property="Foreground" Value="DarkRed" /> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </DataTrigger> 
       </Style.Triggers> 

      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</DataTemplate> 
Смежные вопросы