我使用反射創建了一個DataTable以從我的類中獲取屬性,並將其設置爲DataContext for my Microsoft.Windows.Controls.DataGrid :儘管設置了DataContext,我的WPF Toolkit DataGrid上的Columns屬性仍未設置
// 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包含諸如標題,藝術家,BitRate,HasImage等屬性。
我想在DataTable填充數據之前設置DataGrid中某些列的可見性。但是,dataGridView.Columns屬性爲空。如果我等待填充DataTable之後,則設置dataGridView.Columns屬性。
DataTable.Columns屬性在填充表之前設置。
當DataTable綁定到DataGrid時,我還需要做什麼嗎?我無法在XAML中做任何事情,因爲我通過反射動態構建DataTable。
編輯:
我所以只要我檢查Columns.Count我可以訪問數據移動代碼到AutoGeneratedColumns事件處理程序(這似乎被調用兩次)。
但是,我可以設置列可見性或顯示索引 - 但不能同時設置。如果我嘗試這兩種方法,我會在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);
}
是 - DataGrid上的列是根據DataTable中的列自動創建的。我將調查AutoGeneratingColumn事件 – ChrisF 2009-04-09 14:42:03
我實際需要使用AutoGeneratedColumns事件。這實際上會產生兩次,因此我需要在嘗試訪問數據之前檢查Columns.Count。 – ChrisF 2009-04-09 15:01:58