1. ホーム
  2. c#

値に応じてDataGridのセルの色を変更する

2023-09-12 06:41:56

質問

私はWPFデータグリッドを持っており、私は値に応じて異なるセルの色が必要です。私は私のxamlで以下のコードを持っています。

Style TargetType="DataGridCell"

とありますが、セルだけを選択するのではなく、すべての行を選択しているのでしょうか?私は何が足りないのでしょうか?

どのように解決するには?

を設定しようとすると DataGrid.CellStyle を設定しようとすると、DataContext は行になるので、1つのセルに基づいて色を変更したい場合は、特定の列でそうするのが最も簡単かもしれません、特に列はテキストブロック、コンボボックス、チェックボックスのように様々なコンテンツを持つことができるので、。以下は、すべてのセルを薄緑色に設定する例です。 NameJohn :

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <Trigger Property="Text" Value="John">
                    <Setter Property="Background" Value="LightGreen"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

<イグ


を使うこともできます。 ValueConverter を使って色を変更することもできます。

public class NameToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string input = (string)value;
        switch (input)
        {
            case "John":
                return Brushes.LightGreen;
            default:
                return DependencyProperty.UnsetValue;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

使用方法

<Window.Resources>
    <local:NameToBrushConverter x:Key="NameToBrushConverter"/>
</Window.Resources>
...
<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background" Value="{Binding Name, Converter={StaticResource NameToBrushConverter}}"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>


もう一つの方法は、直接 Background をそれぞれの色のブラシを返すプロパティに直接バインドすることです。この場合、色が依存するプロパティのセッターで、プロパティ変更の通知を発生させる必要があります。

public string Name
{
    get { return _name; }
    set
    {
        if (_name != value)
        {
            _name = value;
            OnPropertyChanged(nameof(Name));
            OnPropertyChanged(nameof(NameBrush));
        }
    }
}

public Brush NameBrush
{
    get
    {
        switch (Name)
        {
            case "John":
                return Brushes.LightGreen;
            default:
                break;
        }

        return Brushes.Transparent;
    }
}