🌟
WPF の DataGrid で特定のデータのセルだけ色を変えたい その 2
この記事と同じことの別のやり方です。
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>
Discussion