FlexGrid for WPF
条件付き書式を設定する
基本操作 > スタイル > 条件付き書式を設定する

グリッドでセルのデータに応じて書式を設定する方式では、C1FlexGrid の Columnオブジェクトに含まれる CellTemplate および CellEditingTemplate プロパティを使用して列内のセルを編集するためのビジュアル要素を指定します。

たとえば、次の例では、セルの値に応じて赤や緑色で表示する場合、条件付き列に対して CellTemplate を指定してカスタムセルを作成します。CellTemplate は必要なバウンドプロパティを含むTextBlock 要素を持ちます。

マークアップ
コードのコピー
<c1:Column Binding="{Binding Price}">
    <c1:Column.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Price, StringFormat=n0}" HorizontalAlignment="Right" 
            Foreground="{Binding Price, Converter={StaticResource ForegroundConverter}, ConverterParameter={StaticResource PriceRange} }" 
            FontWeight="{Binding Price, Converter={StaticResource FontWeightConverter}, ConverterParameter={StaticResource PriceRange} }" />
        </DataTemplate>
    </c1:Column.CellTemplate>
</c1:Column>

上記のコードでは、カスタムセルテンプレートの列を作成してデータソースの「Price」フィールドを TextBlock 要素内に「Text」、「Foreground」、「FontWeight」プロパティに連結しています。なお、「Text」プロパティはDouble型で自動に文字列に変換されてデータに連結できます。しかし、「Foreground」、「FontWeight」プロパティの場合はDouble値はブラシュなどに変換できませんので、コンバータを指定する必要があります。

ForegroundConverter と FontWeightConverter コンバータは、範囲を指定するパラメータをサポートしています。コンバータはこの範囲を使って適当なブラッシュやフォントウエートを選択します。また、コンバータとパラメータの両方がページリソースとしてXAML内に指定されます。詳細については、次のコードをご参照ください。

【実行例】

マークアップ
コードのコピー
<Window.Resources>
    <!-- ForeGroundConverter.cs 内にコンバータを実現します-->
    <local:ForegroundConverter x:Key="ForegroundConverter" />
    <!-- FontWeightConverter.cs 内にコンバータを実現します-->
    <local:FontWeightConverter x:Key="FontWeightConverter" />
    <!-- コンバータ範囲 (ポイントの値として実現し、
         X は最低値と Y は最高値となります) -->
    <Point x:Key="PriceRange" X="500" Y="1500" />
    <Point x:Key="WeightRange" X="200" Y="1000" />
    <Point x:Key="CostRange" X="200" Y="1000" />
    <Point x:Key="VolumeRange" X="2000" Y="6000" />
</Window.Resources>

コンバータの実現方法については、次のコードをご参照ください。

コードのコピー
'ForegroundConverter
Public Class ForegroundConverter
    Implements IValueConverter
    Shared _brBlack As New SolidColorBrush(Colors.Black)
    Shared _brRed As New SolidColorBrush(Colors.Red)
    Shared _brGreen As New SolidColorBrush(Colors.Green)

    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim range = DirectCast(parameter, Point)
        Dim val As Double = CDbl(value)
        Return If(val < range.X, _brRed, If(val > range.Y, _brGreen, _brBlack))
    End Function
    Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException()
    End Function
End Class
コードのコピー
'FontWeightConverter
Public Class FontWeightConverter
    Implements IValueConverter
    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim range = DirectCast(parameter, Point)
        Dim val As Double = CDbl(value)
        Return If(val < range.X, FontWeights.Bold, If(val > range.Y, FontWeights.Bold, FontWeights.Normal))
    End Function
    Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException()
    End Function
End Class
コードのコピー
//ForegroundConverter
public class ForegroundConverter : System.Windows.Data.IValueConverter
{
    static SolidColorBrush _brBlack = new SolidColorBrush(Colors.Black);
    static SolidColorBrush _brRed = new SolidColorBrush(Colors.Red);
    static SolidColorBrush _brGreen = new SolidColorBrush(Colors.Green);

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var range = (Point)parameter;
        double val = (double)value;
        return
            val < range.X ? _brRed :
            val > range.Y ? _brGreen :
            _brBlack;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
コードのコピー
//FontWeightConverter
public class FontWeightConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var range = (Point)parameter;
        double val = (double)value;
        return
            val < range.X ? FontWeights.Bold :
            val > range.Y ? FontWeights.Bold :
            FontWeights.Normal;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

関連トピック