リフレクションを使用してDataTableを作成し、クラスからプロパティを取得して、これをMicrosoft.Windows.Controls.DataGridのDataContextとして設定しました。
// Create the columns based on the data in the album info - get by reflection
var ai = new AlbumInfo();
Type t = ai.GetType();
dataTable.TableName = t.Name;
foreach (PropertyInfo p in t.GetProperties())
{
var columnSpec = new DataColumn();
// If boolean or int type can create directly into grid, else create a text box
if (p.PropertyType == typeof(bool) || p.PropertyType == typeof(int))
{
columnSpec.DataType = p.PropertyType;
}
else
{
columnSpec.DataType = typeof(string);
}
columnSpec.ColumnName = p.Name;
dataTable.Columns.Add(columnSpec);
}
dataGridView.DataContext = dataTable;
AlbumInfoには、Title、Artist、BitRate、HasImageなどのプロパティが含まれています。
DataTableにデータが入力される前に、DataGridの特定の列の表示を設定しようとしています。ただし、dataGridView.Columnsプロパティはnullです。DataTableがいっぱいになるまで待つと、dataGridView.Columnsプロパティが設定されます。
DataTable.Columnsプロパティは、テーブルがいっぱいになる前に設定されます。
DataTableをDataGridにバインドするときに他に何かする必要がありますか?リフレクションを介してDataTableを動的に構築しているため、XAMLでは何もできません。
編集:
Columns.Countをチェックする限り、コードをAutoGeneratedColumnsイベントハンドラー(2回呼び出されるようです)に移動しました。データにアクセスできます。
ただし、列の可視性または表示インデックスのいずれかを設定できますが、両方を設定することはできません。両方を実行しようとすると、WPFToolkitDataGridコードの他の場所でインデックスが範囲外の例外になります。誰かがなぜ何か考えを持っていますか?
私のコードは次のとおりです。
foreach (object columnData in Properties.Settings.Default.ColumnData)
{
DataGridColumn column = dataGridView.Columns[index];
column.DisplayIndex = columnData.DisplayIndex;
column.Visibility = columnData.Visible ? Visibility.Visible : Visibility.Hidden;
AddContextMenuItem(dataGridView.ContextMenu, columnData.Header, index++, columnData.Visible);
}
AddContextMenuItemは私のメソッドの1つです:
private void AddContextMenuItem(ContextMenu contextMenu, string columnName, int index, bool visible)
{
var menuItem = new MenuItem() { Header = columnName, Tag = index, IsCheckable = true, IsChecked = visible };
menuItem.Click += new RoutedEventHandler(contextMenu_onClick);
contextMenu.Items.Add(menuItem);
}