前回ポストの Dapperの結果のDapperRowのコレクションを単純なDictionaryのコレクションに変換する - きよくらの備忘録 に関連して。
List<Dictionary<string, object>>
の形のデータをWPFのDataGridにバインドするのに少し手間取ったので備忘録として。
XAMLでDataGridTextColumnを定義する場合
XAML:
<DataGrid xName="DataGrid" AutoGenerateColumns="False">
<DataGridColumns>
<DataGridTextColumn Header="ID" Binding="{Binding Item[ID]}" />
<DataGridTextColumn Header="Name" Binding="{Binding Item[Name]}" />
<DataGridTextColumn Header="ID" Binding="{Binding Item[BirthDay]}" />
</DataGridColumns>
</DataGrid>
C#コード:
public MainWindow()
{
InitializeComponent();
var list = new List<Dictionary<string, object>>
{
new Dictionary<string, object>() {{"ID", 1}, {"Name", "Taro"}, {"BirthDay",new DateTime(2001,10,1)}},
new Dictionary<string, object>() {{"ID", 2}, {"Name", "Jiro"}, {"BirthDay",new DateTime(2004,2,3)}},
new Dictionary<string, object>() {{"ID", 3}, {"Name", "Saburo"}, {"BirthDay",new DateTime(2010,5,21)}}
};
DataGrid.ItemsSource = list;
}
実行結果例:
動的にDataGridTextColumnを定義する場合
前回の例のようにKeyを事前にXAMLに記述決定できないような場合はDataGridTextColumn を動的に生成すればOK
XAML:
<DataGrid xName="DataGrid" AutoGenerateColumns="False">
<DataGridColumns />
</DataGrid>
C#コード:
public MainWindow()
{
InitializeComponent();
var list = new List<Dictionary<string, object>>
{
new Dictionary<string, object>() {{"ID", 1}, {"Name", "Taro"}, {"BirthDay",new DateTime(2001,10,1)}},
new Dictionary<string, object>() {{"ID", 2}, {"Name", "Jiro"}, {"BirthDay",new DateTime(2004,2,3)}},
new Dictionary<string, object>() {{"ID", 3}, {"Name", "Saburo"}, {"BirthDay",new DateTime(2010,5,21)}}
};
foreach (var key in list[0].Keys)
{
DataGrid.Columns.Add(new DataGridTextColumn()
{
Header = key,
Binding = new Binding($"Item[{key}]")
});
}
DataGrid.ItemsSource = list;
}