C# 我的WPF工具包DataGrid上的Columns属性为';尽管已设置DataContext,但仍无法设置
我已使用反射创建了一个DataTable,以从类中获取属性,并将其设置为Microsoft.Windows.Controls.DataGrid的DataContext:C# 我的WPF工具包DataGrid上的Columns属性为';尽管已设置DataContext,但仍无法设置,c#,datagrid,wpftoolkit,C#,Datagrid,Wpftoolkit,我已使用反射创建了一个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; foreac
// 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包含标题、艺术家、比特率、HasImage等属性
我试图在DataTable充满数据之前设置DataGrid中某些列的可见性。但是,dataGridView.Columns属性为空。如果我等到DataTable被填充之后,那么就会设置dataGridView.Columns属性
在填充表之前设置DataTable.Columns属性
将DataTable绑定到DataGrid时,我还需要做什么?我无法在XAML中执行任何操作,因为我正在通过反射动态构建数据表
编辑:
我已经将代码移动到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);
}
我是否了解您想要控制自动生成列的可见性?我认为DataGrid的AutoGeneratingColumn事件将非常适合于此。它为每个自动生成的列触发一次。此时,您可以修改列的属性(例如设置可见性)或执行
e.Cancel=true
,以阻止创建该列。我意识到我看到的行为是正确的,我只能在Daniel的回答为我指明了正确的方向后才能访问列(即使不是100%正确)。但是,这会导致在尝试设置可见性和显示索引时出现后续问题
我报告了无法在Codeplex讨论板上同时设置显示索引和可见性的问题,并且刚刚得到回复:
这确实是一个bug,我们已经
在我们的数据库中提交了一个bug来跟踪
这个问题
你可以试着解决这个问题
通过调用Dispatcher.BeginInvoke
已加载文件中的后台优先级
事件看来问题确实如此
如果订单更改,则不会发生
在页面达到稳定状态后
国家
我不确定我是否会仔细检查这项工作。我在WPF中重写了一个WinForms应用程序作为一个学习练习,而这项工作并不是真正必要的
更新
我使用的是3.5.40320.1版,标签为2009年3月
我刚刚更新到版本3.5.40619.1,标签为2009年6月,设置可见性和显示索引的问题已经解决。Yes-DataGrid上的列是根据DataTable中的列自动创建的。我将调查使用AutoGeneratedColumns事件实际需要的AutoGeneratedColumns事件。这实际上是两次提出,所以我需要检查列。在尝试访问数据之前计数。我接受我自己的答案,因为它解释了当前的位置。