🌟

WPF の DataGrid で特定のデータのセルだけ色を変えたい その 2

2022/11/18に公開

この記事と同じことの別のやり方です。

https://zenn.dev/okazuki/articles/change-datagrid-cell-color

WPF の XAML って凄く強力なので色々 XAML で頑張れば出来てしまうことが多いのですが XAML に色々書きたくないとか再利用性を上げたいといったケースでは C# で書ける部分は書いておいて、それを XAML から使うという方法が良いこともあります。

例えば今回のケースであればコンバーターが使えます。年齢を色にコンバートする感じです。こんな感じの実装になります。

public class AgeToBackgroundConverter : IValueConverter
{
    public Brush DefaultBrush { get; set; } = Brushes.Transparent;
    public Brush AhoBrush { get; set; } = Brushes.LimeGreen;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is not int age)
        {
            return DefaultBrush;
        }

        return (age % 3 == 0 || age.ToString().Contains("3")) ? AhoBrush : DefaultBrush;
    }

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

これを使うようにすると XAML は以下のように書けます。

MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <!-- コンバーターをリソースに追加 -->
        <local:AgeToBackgroundConverter x:Key="AgeToBackgroundConverter" />
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" IsReadOnly="True">
            <d:DataGrid.ItemsSource>
                <x:Array Type="{x:Type local:Person}">
                    <local:Person Name="Tanaka" Age="33" />
                    <local:Person Name="Kimura" Age="83" />
                    <local:Person Name="Inoue" Age="23" />
                    <local:Person Name="Ota" Age="41" />
                </x:Array>
            </d:DataGrid.ItemsSource>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                <DataGridTextColumn Header="Age" Binding="{Binding Age}">
                    <DataGridTextColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <!-- セルの背景色を年齢とバインドして、コンバーターに先ほど作ったものを指定 -->
                            <Setter Property="Background" Value="{Binding Age, Converter={StaticResource AgeToBackgroundConverter}}" />
                        </Style>
                    </DataGridTextColumn.CellStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
Microsoft (有志)

Discussion