在 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