我正在尝试在WPF DataGrid中显示前键值。问题是当我加载窗口时,datagrid字段保持为空。但是,当我插入或更新数据时(在单独的窗口中进行操作),并且刷新了数据网格,这些值将正确显示。
这是我绑定它的方式:
<DataGridTextColumn Header="Team" Binding="{Binding Team.TeamName}"/>
DataGrid控件位于EmployeesWindow.xaml
中
这是带有外键的表:
public class Employee
{
[Key]
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
//..
[ForeignKey("Team")]
public int TeamId { get; set; }
public Team Team { get; set; }
}
这是被引用的表
public class Team
{
[Key]
public int TeamId { get; set; }
public string TeamName { get; set; }
public int TeamBonus { get; set; }
}
在EmployeesWindow.xaml
中:
public static DataGrid datagrid;
public EmployeesWindow()
{
InitializeComponent();
datagrid = EmployeeDataGrid;
datagrid.ItemsSource = _db.Employees.ToList();
}
在TeamsWindow.xaml
中:
private void AddEmployee_Click(object sender, RoutedEventArgs e)
{
//..
EmployeesWindow.datagrid.ItemsSource = _db.Employees.ToList();
this.Hide();
}
如何在WPF DataGrid数据绑定中显示外键值?
答案 0 :(得分:1)
我猜这是您正在使用的实体框架,而_db是dbcontext。
默认情况下,EF使用延迟加载相关表。
看看您的linq将产生的SQL。
How do I view the SQL generated by the Entity Framework?
我希望您会发现_db.Employees.ToList();只是给出了“从员工中选择*”之类的内容。
您还需要明确地告诉它以阅读团队。
假设表的名称为Teams,则为:
datagrid.ItemsSource = _db.Employees.Include(“ Teams”)。ToList();
不要只是将其粘贴并按f5键。检查表名是什么以及它将产生什么SQL。
每次使用linq时,都要习惯于检查它产生的sql。使用类似这样的简单内容,您应该立即在原始查询中看不到内部加入Teams。使用更复杂的内容,您可以轻松地发现LINQ产生可怕的sql。
http://www.entityframeworktutorial.net/lazyloading-in-entity-framework.aspx
https://docs.microsoft.com/en-us/ef/ef6/querying/related-data
顺便说一句。
从结构上来说,从数据库中读取整个表并将其直接呈现给UI在许多方面都是不好的。也许这只是原型产品,但是您将使用视图模型,observablecollection,mvvm,tolistasync,并在生产版本中过滤掉200,000名员工。