DataGridのセルにStringFormatを適用する・右寄せをする

2020-03-25

BindingにStringFormatを組み合わせることで、元データでデータを編集することなく、
桁区切りや日付のフォーマットなどを調整することができる。

また、ElementStyleにてTextAlignmentを設定することで、右寄せ・中央寄せができる。

CSファイル

public MainWindow()
{
    InitializeComponent();

    DataTable dtData = new DataTable();
    dtData.Columns.Add("date", typeof(DateTime));
    dtData.Columns.Add("name",typeof(string));
    dtData.Columns.Add("price",typeof(int));
    dtData.Columns.Add("num", typeof(int));
    dtData.Columns.Add("total", typeof(int));

    dtData.Rows.Clear();

    AddItem(ref dtData, DateTime.Now, "冷蔵庫", 33110, 1200);
    AddItem(ref dtData, DateTime.Now, "洗濯機", 28910, 900);
    AddItem(ref dtData, DateTime.Now, "掃除機", 67500, 1180);
    AddItem(ref dtData, DateTime.Now, "電子レンジ", 6450, 800);
    AddItem(ref dtData, DateTime.Now, "エアコン", 48340, 620);

    this.DataContext = dtData;
}

private void AddItem(ref DataTable dtData, DateTime datetime, string name, int price, int num)
{
    DataRow drRow = dtData.NewRow();

    drRow["date"] = datetime;
    drRow["name"] = name;
    drRow["price"] = price;
    drRow["num"] = num;
    drRow["total"] = price * num;

    dtData.Rows.Add(drRow);
}

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="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding}" AutoGenerateColumns ="False" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="日付" Binding="{Binding date, StringFormat={}{0:yyyy/MM/dd}}" />
                <DataGridTextColumn Header="商品名" Binding="{Binding name}" />
                <DataGridTextColumn Header="単価" Binding="{Binding price, StringFormat={}{0:C}, ConverterCulture=ja-JP}">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextAlignment" Value="Right" />
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="数量" Binding="{Binding num, StringFormat={}{0:#,0}}">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextAlignment" Value="Right" />
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="合計" Binding="{Binding total, StringFormat={}{0:C}, ConverterCulture=ja-JP}">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextAlignment" Value="Right" />
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>