Q091. XamDataGrid で特定データの前景色を変更後、マウスホバー行や選択セルに設定した前景色を反映するには?
A.CellValuePresenter クラスのスタイルで、ForegroundActiveStyleプロパティ・ForegroundActiveStyle プロパティを編集します。
以下のサンプルでは、department 列が「事務」のレコードの前景色を赤に設定してますが、変更した行の上にマウスを移動したり、設定行のセルを選択すると、既定のスタイルで前景色が上書きされてしまいます。
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:igDP="http://infragistics.com/DataPresenter" xmlns:igWindows="http://infragistics.com/Windows" Title="MainWindow" Height="320" Width="540" WindowStartupLocation="CenterScreen" > <Window.Resources> <Style TargetType="{x:Type igDP:DataRecordCellArea}" > <Setter Property="Foreground" Value="Black" /> <Style.Triggers> <!-- DataTrigger で department 列が「事務」の場合、前景色を赤に設定します --> <DataTrigger Binding="{Binding Path=Cells[department].Value}" Value="事務"> <Setter Property="Foreground" Value="Red" /> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="8" /> <ColumnDefinition /> <ColumnDefinition Width="8" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="8" /> <RowDefinition Height="30" /> <RowDefinition Height="4" /> <RowDefinition /> <RowDefinition Height="8" /> </Grid.RowDefinitions> <igDP:XamDataGrid Name="xamDataGrid1" Grid.Column="1" Grid.Row="3" BindToSampleData="True" /> </Grid> </Window>
アクティブなセルの前景色は CellValuePresenter.ForegroundActiveStyle、マウスホバーの前景色は CellValuePresenter.ForegroundHoverStyle で設定するので、上位要素*1である DataRecordCellArea の設定が反映されるよう、{RelativeSource FindAncestor} を使って設定します。長くなるので、Window.Resources の箇所だけ抜き出しました。なおマウスホバー行で、マウス直下のセル以外が既定の前景色で上書きされてしまうのは、致し方ないようです。
<!-- CellValuePresenter のスタイルで DataRecordCellArea の前景色にするよう設定 --> <Style TargetType="{x:Type igDP:CellValuePresenter}" > <Setter Property="ForegroundActiveStyle" > <Setter.Value> <Style TargetType="ContentPresenter"> <Setter Property="TextElement.Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:DataRecordCellArea}}}"/> </Style> </Setter.Value> </Setter> <Setter Property="ForegroundHoverStyle" > <Setter.Value> <Style TargetType="ContentPresenter"> <Setter Property="TextElement.Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igDP:DataRecordCellArea}}}"/> </Style> </Setter.Value> </Setter> </Style>
参考記事 : プレゼンタ
参考記事 : RelativeSource のマークアップ拡張機能
参考記事 : 第5回 WPFの「データ・バインディング」を理解する
参考記事 : BindingのRelativeSourceの設定色々