2017-04-10 105 views
1

我有一個datagrid,它是一個金融計算器,其中一些單元格在負值上變爲紅色。這是通過DataTrigger與轉換器完成的。我也有覆蓋系統高亮選擇顏色。我現在的問題是,當我選擇一行時,紅色單元格不會突出顯示。WPF數據網格。無法突出顯示自定義樣式的單元格

Here's the picture

據我瞭解自定義單元格樣式將覆蓋選擇。我希望我的自定義紅色單元格也可以用0.5不透明藍色條突出顯示。我怎樣才能解決這個問題?

嗯,我可以添加一個額外的觸發器的單元格樣式,選擇後更改BG顏色,並調整顏色以適合,但這是一個kludge。或者,也許我可以在某處實現帶有不透明度的疊加顏色?

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

以下是完整的代碼。這是一個簡潔,重量輕,但充分工作的例子。

XAML

<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> 

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

「未完善」與否,電池的Background確實將「覆蓋」的行的背景,所以你應該添加另一個觸發細胞考慮到這一點的風格。例如,你可以使用一個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。但你爲什麼認爲這是一個「混亂」?我認爲它相當優雅。

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

相關問題