本文へスキップ
BecomeCoder

C# WPFコース · 第1章 WPF ― デスクトップアプリ開発 · レッスン9

DataGrid(表)

ブラウザで完結

導入

DataGridは、複数行×複数列のデータを表(Excelのような格子)で表示・編集するコントロールです。一覧画面や管理画面で頻出します。

XAMLサンプル(読み物)

<!-- AutoGenerateColumns="False" で列を自分で定義する -->
<DataGrid x:Name="grid" AutoGenerateColumns="False" Height="150">
    <DataGrid.Columns>
        <DataGridTextColumn Header="商品" Binding="{Binding Name}" Width="*" />
        <DataGridTextColumn Header="価格" Binding="{Binding Price}" Width="80" />
    </DataGrid.Columns>
</DataGrid>
// コレクションを流し込む(各列の Binding がプロパティ名に対応)
grid.ItemsSource = new List<Product>
{
    new Product("マウス", 2980),
    new Product("キーボード", 5980),
};

record Product(string Name, int Price);

主なプロパティ

  • ItemsSource … 表示するデータ(コレクション)
  • AutoGenerateColumnsfalseで列を手動定義(推奨)
  • Columns … 列定義(DataGridTextColumnなど)
  • IsReadOnly … 編集不可にする
  • CanUserAddRows … 末尾の空行での追加を許すか

主なイベント

  • SelectionChanged … 行選択の変化
  • CellEditEnding … セル編集の確定時

MVVM(実務ではこう書く)

表データもViewModelのObservableCollectionItemsSourceにバインドします。列のBindingは各要素のプロパティ名に対応します(コードビハインドでgrid.ItemsSource = ...する必要がなくなります)。

<DataGrid ItemsSource="{Binding Products}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="商品" Binding="{Binding Name}" Width="*" />
        <DataGridTextColumn Header="価格" Binding="{Binding Price}" Width="80" />
    </DataGrid.Columns>
</DataGrid>
using System.Collections.ObjectModel;

public ObservableCollection<Product> Products { get; } = new()
{
    new Product("マウス", 2980),
    new Product("キーボード", 5980),
};

試す(ローカル)

  • コードビハインドのgrid.ItemsSource = ...を、ViewModelのProductsへのItemsSourceバインドに置き換える。IsReadOnly="False"でセル編集も試す。

まとめ

  • DataGridは表形式でデータを表示・編集
  • ItemsSourceにコレクション、Columnsで列を定義
  • 実務ではObservableCollectionをViewModelに持ちItemsSourceにバインド

次回: 画像を表示するImageです。

実際に動かしてみよう

下のエディタに XAML を書くと、右側のプレビューにその場で WPF 風のUIが描画されます。テキスト入力・チェック・選択はそのまま動き、`{Binding}` で結んだ TextBox と TextBlock は打った文字がリアルタイムで反映されます。本文の XAML を打ち込んだり、属性(Width・Margin・FontSize・色など)を書き換えたりして、レイアウトの変化を確かめながら進めましょう(C# のコードビハインドや Command、ItemsSource などC#側のデータに依存する処理は実行されません。それらは Visual Studio で試します)。

XAML (WPF) プレビュー

書いた XAML をその場で WPF 風の画面に描画する学習用プレビューを読み込みます(本物のWPFではなく、レイアウトとコントロールの見た目・{Binding}の双方向バインディングを再現したものです。C#のコードビハインド/Command は実行されません)。
スクロールして表示された時点でも自動で読み込まれます。