2017-04-10 48 views
1

저는 음수 값으로 빨간색으로 변하는 셀이있는 재무 계산기 인 DataGrid가 있습니다. 이 작업은 변환기가있는 DataTrigger를 통해 수행됩니다. 또한 시스템 강조 표시 선택 색상을 재정의했습니다. 내 문제는 지금 행을 선택할 때 빨간색 셀이 강조 표시되지 않는다는 것입니다.WPF DataGrid. 사용자 지정 스타일의 셀을 강조 표시 할 수 없습니다.

Here's the picture

는 지금까지 내가 이해 사용자 정의 셀 스타일은 선택보다 우선합니다. 내 사용자 지정 빨간색 셀을 0.5 불투명도 파란색 막대로 강조 표시하고 싶습니다. 이 문제를 어떻게 해결할 수 있습니까?

음, 선택시 BG 색상을 변경하고 색상을 맞추기 위해 추가 트리거를 셀 스타일에 추가 할 수 있습니다.하지만 이는 오히려 불쾌감입니다. 아니면 어떻게 든 여기에 불투명도로 오버레이 색상을 구현할 수 있습니까?

<Trigger Property="IsSelected" Value="True"> 
    <Setter Property="Background" Value="LightBlue" /> 
</Trigger> 

아래는 전체 코드입니다. 이것은 가볍고 가벼우 며 완전히 작동하는 예입니다.

XAML, 셀의 Background 참 "재정의"행의 배경이 셀에 다른 트리거를 추가해야합니다 있도록 C#

using System; 
using System.Collections.ObjectModel; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Data; 

namespace Datagrid_Cell_Highlight 
{ 
    public class TableData 
    { 
     public decimal IncomeDay { get; set; } 
     public decimal IncomeWeek { get; set; } 
     public decimal IncomeMonth { get; set; } 
     public decimal IncomeYear { get; set; } 
    } 

    public class ViewModel 
    { 
     public ObservableCollection<TableData> MainTable { get; set; } 
     public ViewModel() 
     { 
      MainTable = new ObservableCollection<TableData> 
      { 
       new TableData { IncomeDay = (decimal)1.11 }, 
       new TableData { IncomeDay = (decimal)2.22 }, 
       new TableData { IncomeDay = (decimal)-1.23 }, 
       new TableData { IncomeDay = (decimal)-2.34 } 
      }; 
      foreach (var table in MainTable) 
      { 
       table.IncomeWeek = table.IncomeDay * 7; 
       table.IncomeMonth = table.IncomeDay * 30; 
       table.IncomeYear = table.IncomeDay * 365; 
      } 
     } 
    } 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new ViewModel(); 
     } 
    } 

    public class ValueToBoolConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if ((value is decimal) && ((decimal)value < 0)) 
       return true; 
      else return false; 
     } 

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

답변

0

"Kludge"여부를

<Window.Resources> 
     <local:ValueToBoolConverter x:Key="ValueToBoolConverter"/> 
    </Window.Resources> 
    <Grid> 
     <DataGrid ItemsSource="{Binding MainTable}" 
        AutoGenerateColumns="False" 
        CanUserAddRows="False"> 
      <DataGrid.RowStyle> 
       <Style TargetType="DataGridRow"> 
        <Setter Property="Background" Value="Azure"/> 
        <Style.Resources> 
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Blue" Opacity="0.5" /> 
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
         <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" /> 
        </Style.Resources> 
       </Style> 
      </DataGrid.RowStyle> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Income Day" Binding="{Binding IncomeDay}" /> 
       <DataGridTextColumn Header="Income Week" Binding="{Binding IncomeWeek}"> 
        <DataGridTextColumn.CellStyle> 
         <Style TargetType="DataGridCell"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding IncomeWeek, Converter={StaticResource ValueToBoolConverter}}" Value="true"> 
            <Setter Property="Background" Value="Salmon"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </DataGridTextColumn.CellStyle> 
       </DataGridTextColumn> 
       <DataGridTextColumn Header="Income Month" Binding="{Binding IncomeMonth}" /> 
       <DataGridTextColumn Header="Income Year" Binding="{Binding IncomeYear}" Width="*" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 

스타일을 고려해야합니다. 당신은 예를 들어 MultiDataTrigger와 빨간색과 파란색 브러시를 모두 포함하는 DrawingBrush을 사용할 수

<DataGridTextColumn Header="Income Week" Binding="{Binding IncomeWeek}"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IncomeWeek, Converter={StaticResource ValueToBoolConverter}}" Value="true"> 
        <Setter Property="Background" Value="Salmon"/> 
       </DataTrigger> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding IncomeWeek, Converter={StaticResource ValueToBoolConverter}}" Value="true" /> 
         <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Background"> 
         <Setter.Value> 
          <DrawingBrush Viewport="0,0,1,1" TileMode="Tile"> 
           <DrawingBrush.Drawing> 
            <DrawingGroup> 
             <GeometryDrawing> 
              <GeometryDrawing.Geometry> 
               <RectangleGeometry Rect="0,0,1,1" /> 
              </GeometryDrawing.Geometry> 
              <GeometryDrawing.Brush> 
               <SolidColorBrush Color="Salmon"/> 
              </GeometryDrawing.Brush> 
             </GeometryDrawing> 
             <GeometryDrawing> 
              <GeometryDrawing.Geometry> 
               <RectangleGeometry Rect="0,0,1,1" /> 
              </GeometryDrawing.Geometry> 
              <GeometryDrawing.Brush> 
               <SolidColorBrush Color="Blue" Opacity="0.2"/> 
              </GeometryDrawing.Brush> 
             </GeometryDrawing> 
            </DrawingGroup> 
           </DrawingBrush.Drawing> 
          </DrawingBrush> 
         </Setter.Value> 
        </Setter> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 
+0

내가 필요한 것을 정확히 수행합니다. 수락 됨. – Disodium

0

당신이 사용 MultiDataTrigger를 얻을 수 있습니다. 그런데 왜 이것이 "kludge"라고 생각합니까? 나는 그것이 다소 우아한 것이라고 생각한다.

mm8의 코드는 단순히 두 개의 MultiDataTriggers를 설정하는 것입니다. IsSelected가 false 일 때 첫 번째 트리거이고 IsSelected가 true 일 때 두 번째 방법입니다.

<DataGridTextColumn.CellStyle> 
    <Style TargetType="DataGridCell">    
     <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False"/> 
        <Condition Binding="{Binding IncomeWeek, Converter={StaticResource ValueToBoolConverter}}" Value="True"/> 
       </MultiDataTrigger.Conditions> 
       <MultiDataTrigger.Setters> 
        <Setter Property="Background" Value="Salmon"/> 
       </MultiDataTrigger.Setters> 
      </MultiDataTrigger> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/> 
        <Condition Binding="{Binding IncomeWeek, Converter={StaticResource ValueToBoolConverter}}" Value="True"/> 
       </MultiDataTrigger.Conditions> 
       <MultiDataTrigger.Setters> 
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
        <Setter Property="BorderThickness" Value="0"/> 
       </MultiDataTrigger.Setters> 
      </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGridTextColumn.CellStyle> 
+0

이 작품, upvoted지만, 그의 불투명도를 구현하기 때문에 mm8의 대답을 수락했습니다. "kludge"에 관해서는이 방법을 여러 컬럼에 재사용하는 간단한 방법을 볼 수 없습니다. 그러나 그것은 아마도 또 다른 질문 일 것입니다. – Disodium