在 WPF 中使用 DataTable 和 DataGrid 时发生 System.Windows.Data 错误

Posted

技术标签:

【中文标题】在 WPF 中使用 DataTable 和 DataGrid 时发生 System.Windows.Data 错误【英文标题】:When using DataTable and DataGrid in WPF System.Windows.Data Error occurs 【发布时间】:2011-05-12 02:27:02 【问题描述】:

我使用 WPFToolkit 的 DataGrid 来显示一些数据。

DataTable 在 myfile.xaml.cs 中被初始化为

myTable = new DataTable();
DataColumn col;
col = new DataColumn();
col.DataType = System.Type.GetType("System.Int64");
col.ColumnName = "ID";
col.ReadOnly = true;
col.Unique = false;
myTable.Columns.Add(col);

col = new DataColumn();
col.DataType = System.Type.GetType("System.String");
col.ColumnName = "Name";
col.ReadOnly = true;
col.Unique = false;
myTable.Columns.Add(col);

等等。

按照这里的建议,我使用

myGrid.ItemsSource = myTable.DefaultView;

在 myfile.xaml.cs 中。

在 myfile.xaml 我只定义了

<my:DataGrid Name="myGrid" xmlns:my="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"/>

当我使用

向表中添加条目时
DataRow row = myTable.NewRow();
row["ID"] = 123;
row["Name"] = "MyName";

Action action = () => myTable.Rows.Add(row);
Dispatcher.Invoke(action);

条目已正确添加到 GUI 的网格中,但是我收到以下错误:

System.Windows.Data Error: 39 : BindingExpression path error: 'ID' property not found on 'object' ''Object' (HashCode=29890231)'. BindingExpression:Path=ID; DataItem='Object' (HashCode=29890231); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 39 : BindingExpression path error: 'Name' property not found on 'object' ''Object' (HashCode=29890231)'. BindingExpression:Path=Name; DataItem='Object' (HashCode=29890231); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

那么我该如何解决这个错误呢? 有什么提示吗?

谢谢。

【问题讨论】:

FWIW - 我刚刚在 3.5 上“按原样”运行了您的代码,它可以正常工作。也许你有一个损坏的工具包 dll?还是? 好的,感谢您提供的信息。所以也许这只是一个配置问题。 【参考方案1】:

我认为这与您执行代码的顺序有关。尝试改变这个:

DataRow row = myTable.NewRow();
row["ID"] = 123;
row["Name"] = "MyName";

Action action = () => myTable.Rows.Add(row);
Dispatcher.Invoke(action);

进入这个:

DataRow row = myTable.NewRow();
myTable.Rows.Add(row);
row["ID"] = 123;
row["Name"] = "MyName";

即:在将项目添加到行之前,将行添加到数据表中

【讨论】:

不幸的是,更改订单并没有帮助。而且我必须保留 Action 和 Dispatcher,因为这段代码不是由主(GUI)线程调用的 嗯 kein glück... 我去看看。不过我有一个问题,您为什么使用工具包的 DataGrid 而不是 4.0 框架中包含的那个? 问题:您的 DataGridColumns 是如何创建的?手动或通过 autogenerateColumns ? 我已将您的代码复制到一个小型测试项目中,我不得不尝试解决您的错误,但未能重现它。由我,该行被添加而没有错误。与您的唯一区别:我使用的是 4.0(所以不是工具包 dataGrid),但我不认为这是 pb,而且我使用的是同一个线程来显示(所以 Dispatcher.Invoke 不会做任何差异),这实际上可能是铅。所以我并没有真正的解决方案,但我认为你应该查看你的线程以找到罪魁祸首 Microsoft 为 4.0 修复了一个类似的错误,也许这就是为什么 4.0 不会出现此错误的原因(请参阅connect.microsoft.com/VisualStudio/feedback/details/484240/…)

以上是关于在 WPF 中使用 DataTable 和 DataGrid 时发生 System.Windows.Data 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 DataTable 更改 WPF 后更新绑定到 DataTable 的 DataGrid

使用 TemplateColumns 将 WPF DataGrid 绑定到 DataTable

如何防止 ComboBox 中的 NewItemPlaceholder 行绑定到与 WPF 中的 DataGrid 相同的 DataTable

wpf获得gridcontrol的datatable

带点的 DataTable 列名称是啥导致它们不适合 WPF 的 DataGrid 控件?

2016.2.28 DataTable用法汇总