我使用反射创建了一个 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 属性为空。如果我等到填充 DataTable 之后,则设置 dataGridView.Columns 属性。
DataTable.Columns 属性是在表格填充之前设置的。
将 DataTable 绑定到 DataGrid 时,我还需要做些什么吗?我无法在 XAML 中做任何事情,因为我正在通过反射动态构建 DataTable。
编辑:
我已将代码移至 AutoGeneratedColumns 事件处理程序(似乎被调用了两次),因此只要检查 Columns.Count 我就可以访问数据。
但是,我可以设置列可见性或显示索引 - 但不能同时设置。如果我尝试同时执行这两项操作,我会在 WPFToolkit DataGrid 代码的其他地方得到索引超出范围异常。任何人有任何想法为什么?
我的代码是:
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 是我的方法之一:
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);
}