2009-04-09 81 views
0

我使用反射創建了一個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); 
} 

回答

0

我意識到我看到的行爲是正確的,我只能在丹尼爾的回答指向正確的方向(即使它不是100%正確)後訪問列。但是,這會導致隨後嘗試設置可見性和顯示索引的問題。

我報告的問題與不能夠同時設置顯示指數和知名度在Codeplex上的討論板和剛回來這個答覆:

這是一個確實是一個錯誤,我們已經 已在我們的數據庫中提出了一個錯誤來追蹤 的問題。

您可以嘗試通過加載 事件中調用Dispatcher.BeginInvoke在 背景優先解決該問題 工作。看起來,如果在頁面達到穩定的 狀態後訂單發生更改 ,則不會發生問題 。

我不知道我是否會檢查該解決辦法。我在WPF中重寫了一個WinForms應用程序作爲學習練習,並且這項工作並不是真正必要的。

UPDATE

我使用的版本3.5.40320.1,標有2009年3月

我剛剛更新到3.5.40619.1版本,標有2009年6月,並同時設置知名度的問題,顯示索引已被修復。

2

難道我明白,你想控制自動生成列的知名度?我認爲DataGrid的AutoGeneratingColumn事件對此非常完美。它會爲每個自動生成的列啓動一次。您可以在此時修改列的屬性(例如設置可見性)或執行e.Cancel = true以防止在處創建該列

+0

是 - DataGrid上的列是根據DataTable中的列自動創建的。我將調查AutoGeneratingColumn事件 – ChrisF 2009-04-09 14:42:03

+0

我實際需要使用AutoGeneratedColumns事件。這實際上會產生兩次,因此我需要在嘗試訪問數據之前檢查Columns.Count。 – ChrisF 2009-04-09 15:01:58

相關問題