2017-04-10 8 views
1

私は、負の値で赤色になるセルを持つ金融計算機であるデータグリッドを持っています。これは、コンバータ付きの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

「その場しのぎ」か

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

これを考慮に入れたスタイル。あなたは、例えば、赤と青のブラシの両方が含まれていMultiDataTriggerDrawingBrushを使用することができます。

<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のコードの代わりに、2つのMultiDataTriggersを設定するだけです。 IsSelectedがfalseの場合にトリガーする最初のものと、IsSelectedがtrueの場合の第2の方法。

<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

これはうまくいきましたが、彼は不透明度を実装しているのでmm8の答えを受け入れました。 "kludge"に関しては、このアプローチを複数の列に再利用する簡単な方法はありません。しかし、それは別の質問かもしれません。 – Disodium

関連する問題