2014-08-14 3 views
0

У меня есть элемент управления DataGrid WPF, который использует пользовательскую раскраску как для строк данных, так и для отдельных ячеек данных. Некоторые строки должны быть окрашены, но есть также отдельные ячейки, которые должны показывать определенный цвет независимо от цвета фона их строки. Я обработки расцветки, как это:WPF DataGrid Coloring - пользовательская раскраска для обоих строк и ячеек

<DataGrid.Resources> 
      <!--Row Coloring--> 
      <Style TargetType="DataGridRow" > 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsInactive}" Value="True"> 
         <Setter Property="Background" Value="DarkGray" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
      <!--Cell Coloring--> 
      <local:ColorConverter_RunToday x:Key="converter_RunToday"/> 
      <Style TargetType="DataGridCell" > 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Header}" Value="Run Today"> 
         <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource converter_RunToday}}"/> 
         <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource converter_RunToday}}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.Resources> 

Моего цвета конвертер класс:

public class ColorConverter_RunToday : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string str = value.ToString().Trim().ToUpper(); 

     if (str == "YES") 
      return Brushes.LightGreen; 

     return Brushes.Transparent; 
    } 

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

Единственная проблема с этой установкой является то, что «Run Сегодня» ячейка с таможенной окраской никогда не будет иметь цвет фона строки. Настройка цвета на Brushes.Transparent по-прежнему просто окрашивает ячейку белого цвета, если текст ячейки не является «YES». Кроме того, когда у меня есть эта строка, выбранная ячейка не получает нормальный синий цвет подсветки.

Я ранее получил решение для работы, индивидуально окрашивая каждую ячейку программным способом вместо использования XAML, но при прокрутке отображался не корректно, если я не отключил виртуализацию строк в сетке. Это приведет к тому, что он будет ужасно работать на сетке, содержащей большое количество данных.

+0

Почему клетки окрашены в зеленый цвет покажет серый? Разве это не то, что вы хотите? Также, пожалуйста, напишите snaphsot, каково это и как вы хотите. –

+0

Если фон окрашен в серый цвет, но ячейка «Выполнить сегодня» - «Да», я хочу, чтобы вся строка была серой, но одна ячейка была зеленой. В противном случае я хочу, чтобы вся строка была серой, включая ячейку «Run Today». Прямо сейчас, ячейка «Run Today» всегда будет либо зеленой, либо белой, а не серой. – Rett

+0

Я пробовал ваш код в образце. Первая точка работает полностью в моем конце. Можете ли вы попробовать его в небольшом образце, чтобы увидеть, находится ли проблема где-то в другом коде. Если он по-прежнему сохраняется, попробуйте разместить здесь образец кода, чтобы мы могли помочь. –

ответ

1

Кажется, что вы заинтересованы только в привлечении ячейки LIGHTGREEN для следующих условий:

  1. имени столбца Run Сегодня.
  2. Сотовый текст: Да.
  3. Сотовая ячейка не выбрана.

Но, с конвертером на месте вы в конечном итоге настройки фона для ячеек, которые не удовлетворяют указанным выше условиям (к прозрачному) приводит к некоторым проблемам. Могут быть переопределяющие значения по умолчанию для dataGrid, поэтому старайтесь избегать этого.

Я предлагаю достичь этого с помощью MultiDataTrigger и предоставить выше 3 условия. (Нет необходимости в преобразователе)

<Style TargetType="DataGridCell" > 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Header}" Value="Run Today"/> 
       <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text}" Value="Yes"/> 
       <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="BorderBrush" Value="LightGreen"/> 
     </MultiDataTrigger> 
    </Style.Triggers> 
</Style> 
+0

Вот и все!У меня просто не было возможности проверить, была ли строка выбрана моим предыдущим решением, но это MultiDataTrigger может справиться с этим. Еще раз спасибо! – Rett

Смежные вопросы