C# WPF DataGrid父子数据
我是WPF/C#/NET新手,但我一直在通过编写一些小练习来学习 不管怎样,我被卡住了。我在这里和谷歌上搜索过,但找不到答案,或者更准确地说,找不到我能理解的答案 我的问题是。。。使用实体框架,我有两个表。一个用于员工详细信息,一个用于公司详细信息。员工为0或1家公司工作 我想通过WPF/XAML定义一个数据网格来导航员工。但在每个员工行中,我想显示他们工作的公司的名称(如果有关系),如果没有相关公司记录,则显示“失业”的名称 我没有给出表的详细信息,因为它实际上并不重要——问题是在单个数据网格中显示来自父/子关系的具体信息 我不知道解决这类问题的最佳方法是什么,我假设使用WPF/DataGrid,因此我非常感谢您对如何进行这项工作、绑定(假设使用WPF)甚至WPF/XAML示例的帮助C# WPF DataGrid父子数据,c#,wpf,entity-framework,datagrid,parent-child,C#,Wpf,Entity Framework,Datagrid,Parent Child,我是WPF/C#/NET新手,但我一直在通过编写一些小练习来学习 不管怎样,我被卡住了。我在这里和谷歌上搜索过,但找不到答案,或者更准确地说,找不到我能理解的答案 我的问题是。。。使用实体框架,我有两个表。一个用于员工详细信息,一个用于公司详细信息。员工为0或1家公司工作 我想通过WPF/XAML定义一个数据网格来导航员工。但在每个员工行中,我想显示他们工作的公司的名称(如果有关系),如果没有相关公司记录,则显示“失业”的名称 我没有给出表的详细信息,因为它实际上并不重要——问题是在单个数据网格
提前感谢。有很多方法可以实现这一点-您可以尝试的一种方法是创建一个视图模型来封装要显示的数据-例如
public class EmployeeViewModel
{
private readonly Employee _employee;
public EmployeeViewModel(Employee employee)
{
_employee = employee;
}
public string Name { get { return _employee.Name; } }
public string CompanyName { get { return _employee.Company == null ? "Unemployed" : _employee.Company.CompanyName; } }
}
然后,给定一个IEnumerable
,您可以将员工数据投影到此视图模型中,并将其设置为DataGrid的ItemsSource,例如
IEnumerable<Employee> employees = GetEmployeesFromDatabase();
DataGrid1.ItemsSource = employees.Select(x => new EmployeeViewModel(x));
然后可以在网格上设置绑定,如下所示:
<DataGrid ItemsSource="{Binding Employees}" ...
谢谢史蒂夫。有几个问题。在我的代码中,我没有像您的示例那样设置网格的ItemsSource。我只需要使用ItemsSource=“{Binding}”,然后在Window_加载的事件中将grids.DataContext设置为我的ObjectSet。现在,当我尝试第二个示例Company.Name时,结果是Company Name没有显示任何内容。如果我有公司,那么我会得到正确公司记录的行id。同样在我的设计公司.Name导致.Name位为红色而不是蓝色。我错了什么?嗨,Chris,在设置网格的DataContext之后,您的ItemsSource=“{Binding}”实现了与将整个视图绑定到更高级别的视图模型(其上有Employees属性)相同的结果,因此没有问题。{Binding Company.Name}假设您的Company对象上有一个名为Name的属性-如果不是这种情况,则需要将Company.Name替换为Company.CompanyName或Company对象上所需的任何属性。Steve,Company表确实有一列Name。公司实体具有名称属性。但我唯一要约束的是员工的集合。我想我错过了一个基本步骤……你应该能够用这种方式绑定员工集合。我假设employee类有一个名为Company的属性?如果是,则{Binding Company.Name}属性路径语法将导航到每行员工的公司属性,然后获取公司的名称属性。查看是否有任何绑定错误的一个好方法是在调试模式下运行,并查看Visual Studio中的输出窗口(调试->窗口->输出)-任何绑定错误通常都会出现在那里。如果您使用的是较旧版本的Entity Framework(V4.0之前的任何版本)默认情况下,Company属性不是惰性加载的-您可能需要在EF查询中使用“Include”语句。无论如何,这通常是一个好主意,可以避免选择n+1问题。
public class MainViewModel
{
private readonly IEnumerable<Employee> _employees;
public MainViewModel(IEnumerable<Employee> employees)
{
_employees = employees;
}
public IEnumerable<Employee> Employees
{
get { return _employees; }
}
}
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel(GetAllEmployees());
}
<DataGrid ItemsSource="{Binding Employees}" ...