我有一个 .Net 数据表,用作 WPF 数据网格的源。我遇到的问题是数据表中的某些列标题包含点。将数据表绑定到数据网格时,会显示包含点的列,但不包含数据。
在网上阅读后,我发现这些点是数据绑定引擎中使用的一种特殊符号,并且混淆了数据网格与表的绑定。
我尝试手动创建数据网格列+绑定并添加方括号来否定点。这工作正常,但是当我对列进行排序时会中断。本文 提到挂钩到排序事件以删除排序事件上的 []。关于如何实现这一点并没有太多细节,我所做的尝试似乎并没有消除错误。
如果您需要更多信息,请告诉我。
我有一个 .Net 数据表,用作 WPF 数据网格的源。我遇到的问题是数据表中的某些列标题包含点。将数据表绑定到数据网格时,会显示包含点的列,但不包含数据。
在网上阅读后,我发现这些点是数据绑定引擎中使用的一种特殊符号,并且混淆了数据网格与表的绑定。
我尝试手动创建数据网格列+绑定并添加方括号来否定点。这工作正常,但是当我对列进行排序时会中断。本文 提到挂钩到排序事件以删除排序事件上的 []。关于如何实现这一点并没有太多细节,我所做的尝试似乎并没有消除错误。
如果您需要更多信息,请告诉我。
Binding正如您所发现的那样,除了WPF之外的任何其他内容的点表示法都是有问题的。我建议修改您的标题以使用点表示法对列名进行别名:
Col.A should be Col_A
Col.B should be Col_B
etc...
如果标头来自直接 SQL 查询,则以相同方式为 sql 列名设置别名。
沿着使用点符号的道路前进,只会继续导致一个骇人听闻的修复来解决以前的“修复”。只需修改您的命名约定,所有这些都可以轻松解决。
Magnus Montin在 Microsot WPF 论坛上解决了这个问题:
AutoGeneratedColumns在现实世界的场景中很少有用。但您也可以处理该AutoGeneratingColumn事件:
<DataGrid Name="dataGrid" AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTextColumn() { Header = e.PropertyName, Binding = new Binding("[" + e.PropertyName + "]") };
}
反正这种视图相关的代码肯定是属于视图的。视图模型不知道也不关心 DataGrid 控件由于某种原因无法显示实际数据的事实。这必须并且应该在视图中修复。
它就像一个魅力!我的示例开始起作用:
XAML:
<DataGrid ColumnWidth="35" ItemsSource="{Binding EmployeeDataTable,
IsAsync=True}" VirtualizingStackPanel.IsVirtualizing="true"
EnableRowVirtualization="True" EnableColumnVirtualization="True"
MaxWidth="2560" MaxHeight="1600"
VirtualizingStackPanel.VirtualizationMode="Recycling"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"/>
后面的代码:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTextColumn() {
Header = e.PropertyName,
SortMemberPath = e.PropertyName, //To allow for sorting on a column
Binding = new Binding("[" + e.PropertyName + "]")
};
}
视图模型:
private DataTable employeeDataTable;
public DataTable EmployeeDataTable
{
get { return employeeDataTable; }
set
{
employeeDataTable = value;
OnPropertyChanged("EmployeeDataTable");
}
}
private void PopulateDataTable()
{
var _ds = new DataSet("Test");
employeeDataTable = new DataTable();
employeeDataTable = _ds.Tables.Add("DT");
for (int i = 0; i < 800; i++)
{
if(i%2==0)
employeeDataTable.Columns.Add(i.ToString() + ".");
else
employeeDataTable.Columns.Add(i.ToString() + "/");
}
for (int i = 0; i < 2; i++)
{
var theRow = employeeDataTable.NewRow();
for (int j = 0; j < 800; j++)
{
if (j % 2 == 0)
{
//theRow[j] = j.ToString();
theRow[j] = "a";
}
else
theRow[j] = CreateDoubleValue(j).ToString();
}
employeeDataTable.Rows.Add(theRow);
}
}