2016-09-19 4 views
0

В настоящее время я пытаюсь (в C#) покрасить ячейки DataGrid на основе их значения. В столбцах DataGrid установлены дни недели (с понедельника по пятницу), и сейчас я могу это сделать, но это очень много. Вот как это в настоящее время:Есть ли более эффективный способ использования триггеров в WPF/XAML?

<DataGrid Name="mapDisplay" ItemsSource="{Binding}" Margin="27,29,27,10" ColumnWidth="73"> 
      <DataGrid.CellStyle> 
       <Style TargetType="DataGridCell"> 
        <Style.Triggers> 

         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 

           <!-- Check if cell has value of 0 in the 'Monday' column. --> 

           <Condition Binding="{Binding Path=Monday}" Value="0"/> 
           <Condition Binding="{Binding Column.DisplayIndex,RelativeSource={RelativeSource Self}}" Value="1"/> 
          </MultiDataTrigger.Conditions> 
          <Setter Property="Background" Value="White" /> 


         </MultiDataTrigger> 
         <MultiDataTrigger> 

           <MultiDataTrigger.Conditions> 
           <!-- Check if cell has value of 1 in the 'Monday' column. --> 

            <Condition Binding="{Binding Path=Monday}" Value="1"/> 
            <Condition Binding="{Binding Column.DisplayIndex,RelativeSource={RelativeSource Self}}" Value="1"/> 
           </MultiDataTrigger.Conditions> 
           <Setter Property="Background" Value="White" /> 
          </MultiDataTrigger> 
           ... 
        </Style.Triggers> 
       </Style> 
      </DataGrid.CellStyle> 
</DataGrid> 

Как вы можете себе представить, делая это от значения 0 до значения 3 (моего максимума) за каждый день итогов недели в некотором чрезвычайно длительном коде XAML. Есть ли способ уменьшить длину и сделать мой код более эффективным или динамичным?

ОБНОВЛЕНИЕ: Это вы имеете в виду, @Freeman?

<dg:DataGrid.ItemContainerStyle> 
    <Style 
     TargetType="{x:Type dg:DataGridColumn}" 
     BasedOn="{StaticResource {x:Type dg:DataGridColumn}}"> 
     <Setter 
      Property="Background" 
      Value="{Binding ItemColour}" /> 
    </Style> 
</dg:DataGrid.ItemContainerStyle> 

Хотя в моем случае я бы использовал конвертер для преобразования значения в цвет?

+0

Я бы Recommand вас есть эти логики на вашей виртуальной машине и просто связать 'Background' цвет' itemstemplate' в виду – Gopichandar

ответ

0

Вы можете написать класс преобразователя

public class DayToBackgroundConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // logic here 
     if(value == "Monday") return Brushes.Blue; //etc... 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // logic here 
    } 
} 

<DataGridTextColumn Binding="{Binding CurrentDay}"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Background" Value="{Binding Name, Converter={StaticResource DayToBackgroundConverter }}"/> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 
+0

Не будет ли этот цвет целый ряд хотя вместо одной ячейки? – PL200

+0

Да, это может быть с помощью ItemContainerStyle datagrid – FreeMan

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