1つ前のエントリでは、CheckBoxを列に出してみた。引き続きComboBoxを出してみようと思う。Personクラスをちょろっと拡張して年齢を持たせることにした。年齢の男/女をComboBoxで表示させようって寸法だ。
namespace WpfDataTableSample
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// C#好きかどうかのフラグ
public bool CSharper { get; set; }
// 性別
public GenderType Gender { get; set; }
}
public enum GenderType
{
男,女
}
}
DataContextに突っ込むデータにも、男と女が交互に出るように書き換えた。
DataContext = Enumerable.Range(10, 50).Select(i =>
new Person
{
Name = "田中 太郎 no" + i,
Age = i % 50,
CSharper = i % 5 == 0,
Gender = i % 2 == 0 ? GenderType.男 : GenderType.女
}).ToList();
次に、ComboBoxを表示するための列の定義を行う。そのための下準備としてWindowのResourcesプロパティにComboBoxに表示するための元データを定義しておく。
<Window.Resources>
<!-- 性別のコンボボックスに表示するためのデータ -->
<x:Array x:Key="GenderTypeSource" Type="{x:Type WpfDataTableSample:GenderType}">
<WpfDataTableSample:GenderType>男</WpfDataTableSample:GenderType>
<WpfDataTableSample:GenderType>女</WpfDataTableSample:GenderType>
</x:Array>
</Window.Resources>
そして、DataGridComboBoxColumnをDataGridのColumnsプロパティに追加する。
<!-- 自動でカラムを生成しないように指定 -->
<WPFToolkit:DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
<WPFToolkit:DataGrid.Columns>
<!-- 名前の表示 -->
<WPFToolkit:DataGridTextColumn DataFieldBinding="{Binding Name}"
Header="なまえ" />
<!-- 年齢の表示 StringFormatでフォーマットも指定してみた -->
<WPFToolkit:DataGridTextColumn DataFieldBinding="{Binding Age, StringFormat=000歳}"
Header="ねんれい" />
<!-- CheckBoxを使うときも基本的にTextBoxと同じようにいける -->
<WPFToolkit:DataGridCheckBoxColumn DataFieldBinding="{Binding CSharper}"
Header="C#大好き?" />
<!-- 性別! -->
<WPFToolkit:DataGridComboBoxColumn DataFieldBinding="{Binding Gender}"
Header="性別"
ItemsSource="{Binding Source={StaticResource GenderTypeSource}}" >
</WPFToolkit:DataGridComboBoxColumn>
</WPFToolkit:DataGrid.Columns>
</WPFToolkit:DataGrid>
TextBoxやCheckBoxのときと同じようにDataFieldBindingとHeaderプロパティに値を設定する。そして、ComboBoxに表意jするためのデータをItemsSourceプロパティに設定する。
今回の例では、さっきWindowのResourcesに用意したGenderTypeSourceをバインドした。
この状態で実行すると、コンボボックスで男と女を選べるようになる。
ここまで順調にきてる。いい感じだ。