【解決方法】Wpf データグリッドの列形式


WPF DataGrid の列形式についてよく読んだことがありますが、数値形式の解決策が見つかりませんでした。 私がこれまでに持っているのは、SQLite データベースと、正常に動作する数行のコードです (数値形式を除く)。 私が欲しいのは、小数点以下2桁です。

...
DataGrid1.Columns.Clear();
DataGrid1.AutoGenerateColumns = false;
Binding bindAmount = new Binding("amount");
CultureInfo germanCulture = CultureInfo.CreateSpecificCulture("de-DE");
bindAmount.ConverterCulture = germanCulture;
DataGridTextColumn colAmount = new DataGridTextColumn();
colAmount.Header = "amount";
colAmount.Binding = bindAmount;
style = new Style();
style.TargetType = typeof(DataGridCell);
se = new Setter();
se.Property = ContentStringFormatProperty;  // these 2 lines
se.Value = "0.00";                          //   don't work !!!
style.Setters.Add(se);
se = new Setter();
se.Property = HorizontalAlignmentProperty;
se.Value = HorizontalAlignment.Right;
style.Setters.Add(se);
colAmount.CellStyle = style;
colAmount.Width = 70;
DataGrid1.Columns.Add(colAmount);
DataGrid1.ItemsSource = dbDataTbl.DefaultView;
...

なぜ私は XAML でそれをしないのですか? 国ごとに異なる形式が必要だからです。

私が試したこと:

上記のテキストとコードを参照してください…

解決策 1

コードではなく XAML を使用すると、 DataGrid.

これは、同様の質問による古い質問への回答の例です。 という新しいプロジェクトを作成します。 WpfDataGridDateColumnFormatting このコードを次の場所にドロップします。

1. という名前の新しいモデルを作成します Widget データを保持するには:

C#
public class Widget
{
    public string? Name { get; set; }
    public DateTime? Date { get; set; }
    public int Quantity { get; set; } = 0;
}

2. 次のコードを MainWindow コード ビハインド:

C#
using System;
using System.Collections.ObjectModel;
using System.Windows;

public partial class MainWindow : Window
{
    private Random random = new();
    public ObservableCollection<Widget> Widgets { get; set; } = new();

    public MainWindow()
    {
        CreateWidgets();
        InitializeComponent();
    }

    private void CreateWidgets()
    {
        for (int i = 0; i < 10; i++)
        {
            Widgets.Add(new()
            {
                Name = $"Widget {i}", 
                Date = DateTime.Now.AddDays(random.NextDouble() * 5),
                Quantity = random.Next(0, 100)
            });
        }
    }
}

3. 今、 MainWindow XAML:

XML
<Window x:Class="WpfDataGridDateColumnFormatting.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"
        mc:Ignorable="d"
        x:Name="Window"
        Title="MainWindow" Height="450" Width="800">

    <DataGrid DataContext="{Binding ElementName=Window}"
              ItemsSource="{Binding Widgets}"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name"
                                Binding="{Binding Name}" />
            <DataGridTextColumn Header="Date"
                                Binding="{Binding Date,
                                          StringFormat={}{0:dd.MM.yy}}" />
            <DataGridTextColumn Header="Quantity"
                                
                                Binding="{Binding Quantity,
                                          StringFormat={}{0:#,##0.00}}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="HorizontalAlignment" Value="Right" />
                    </Style>
                </DataGridTextColumn.ElementStyle>

            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Window>

ここで、上記の手順に従ってアプリを実行すると、最後の 2 つの列がカスタム書式設定で表示され、最後の列が数値書式設定で表示されます。

ご覧のとおり、データ バインディングに直接書式設定を適用しています。

XML
Binding="{Binding Quantity, StringFormat={}{0:#,##0.00}}">

StringFormat プロパティは、データ バインディングと同じ書式設定オプションを使用します。 String.Format. (参照: 標準数値書式文字列[^])

WPF の優れたチュートリアル Web サイト: 完全な WPF チュートリアル – WPF チュートリアル[^]

お役に立てれば!

コメント

タイトルとURLをコピーしました