我有一个具有数据网格的 wpf 应用程序(MVVM 样式)。我使用实体框架作为我的模型。在这个数据网格中,我有一列来自另一个表中的值。我使用导航属性来获取这个值。当数据网格加载有问题的列时,会显示正确的值,但在输出窗口中仍然会生成绑定错误:
System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“tracking_stock_EA7F46EC8AD7F155921357AA6714C6C20BE807C4760A3B6DFC4FAC1954CA8119”(HashCode=49385318)上找不到“product_category”属性。无效的
数据网格行绑定到的对象称为tracking_stock,它的导航属性为product,它本身具有products_category的导航属性,我用它来获取 product_category.chrProdCtgry
这是概述 EF 设计的图像:
所以我的文本块在数据网格模板列中的绑定如下:
<DataGridTemplateColumn Header="CATEGORY" SortMemberPath="product.product_category.chrProdCtgry" ToolTipService.ToolTip="Category of the product" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding product.product_category.chrProdCtgry}" Style="{StaticResource FTC_DetailLabelSub}" Width="120" TextWrapping="NoWrap"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
现在,一切正常,列可以排序,文本块中的文本具有应有的值。
问题:
当一切正常时,为什么会抛出这个绑定错误?
编辑#1:
我试图删除排序声明:
SortMemberPath="product.product_category.chrProdCtgry"
绑定错误仍然存在
编辑#2:
所以我尝试将 IsAsync=True 添加到数据网格本身的文本块和集合绑定中。现在,在我对类别列进行排序之前,不会显示文本块值。此外,上面列出的绑定错误仍然存在,但现在生成了一个新错误:
System.Windows.Data 错误:17:无法从“产品”(类型“产品_83A5741ABC5EE6395B89B7B4B384137E8CF95991EF9918BD4525EF06B774469E”)获取“产品类别”值(类型“产品类别”)。BindingExpression:路径=product.product_category.chrProdCtgry;DataItem='tracking_stock_EA7F46EC8AD7F155921357AA6714C6C20BE807C4760A3B6DFC4FAC1954CA8119' (HashCode=2011918); 目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”) TargetInvocationException:“System.Reflection.TargetInvocationException:调用目标已引发异常。---> System.NullReferenceException:对象引用未设置为对象的实例。
编辑#3:
Sheridan 的帖子让我想到当从数据库上下文创建数据网格的集合时数据不存在。于是我又回到了实体框架的“GET”函数,通过以下三种方式强制包含导航属性,都没有摆脱绑定错误:
1
Dim trackingList = Await Context.tracking_stock.Include("product").ToListAsync
Return New ObservableCollection(Of tracking_stock)(trackingList)
2
Dim trackingList = Await Context.tracking_stock.Include("product.product_category").ToListAsync
Return New ObservableCollection(Of tracking_stock)(trackingList)
3
Dim trackingList = Await Context.tracking_stock.Include("product").Include("product.product_category").ToListAsync
Return New ObservableCollection(Of tracking_stock)(trackingList)