GridDataにデータをバインドする

.NET Frameworkを用いて開発していたプログラムをWPFに移行していたが、どうやったらC#のみでGridDataの生成からデータのバインドまで行えるのかわからずに四苦八苦したので、メモしておく。

"名前","結果","クラス"という3つのデータをGridDataに表示したいならば、まずレコード用クラスを用意する。

public class Result
    {
        public string Name { get; set; }
        public string Result { get; set; }
        public string Class { get; set; }
    }

次にGridDataの生成(今回はAutoGenerateColumnsをfalseにしておく)。Controlのサイズ指定は省略している。

DataGrid grid = new DataGrid();
grid.AutoGenerateColumns = false;

次に必要な分だけDataGridColumnの生成と設定し、GridDataへの登録。今回は文字列を表示したいだけなのでDataGridTextColumnを使用している。

DataGridTextColumn name = new DataGridTextColumn();
name.Header = "名前";
name.Binding = new Binding("Name");
grid.Columns.Add(name);
DataGridTextColumn result = new DataGridTextColumn();
result.Header = "結果";
result.Binding = new Binding("Result");
grid.Columns.Add(result);
DataGridTextColumn className = new DataGridTextColumn();
className.Header = "クラス名";
className.Binding = new Binding("Class");
grid.Columns.Add(className);

各DataGridDataTextColumnオブジェクトのBindingを設定する際にBindingを生成しているが、引数に表示させたいResultクラスのプロパティ名を記述することでデータのバインドが行える。
次に各レコードを保持する入れ物を生成し、表示させたいレコードをどんどん放り込む。

ObservableCollection<Result> list = new ObservableCollection<Result>();

...レコードの追加...

レコードの追加はListクラスなどと一緒でlist.Addで追加していくだけ。
最後に、リストをGridDataのItemSourceとして登録。今回は各データを読み取り専用(行の追加や削除不可)にしたかったのでReadOnlyObservableCollectionで登録している。

 grid.ItemsSource = new ReadOnlyObservableCollection<Result>(list);

これで実行してみると、きちんとGridDataにデータが表示されているはず。

本来ならばWPFではXAMLで記述を行うのがメインになるので、すべてをC#などで記述する必要はないかもしれない。
が、どーしてもプログラム側で生成したいならばこんな感じでやっていけばよいはず。