Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid父子数据_C#_Wpf_Entity Framework_Datagrid_Parent Child - Fatal编程技术网

C# WPF DataGrid父子数据

C# WPF DataGrid父子数据,c#,wpf,entity-framework,datagrid,parent-child,C#,Wpf,Entity Framework,Datagrid,Parent Child,我是WPF/C#/NET新手,但我一直在通过编写一些小练习来学习 不管怎样,我被卡住了。我在这里和谷歌上搜索过,但找不到答案,或者更准确地说,找不到我能理解的答案 我的问题是。。。使用实体框架,我有两个表。一个用于员工详细信息,一个用于公司详细信息。员工为0或1家公司工作 我想通过WPF/XAML定义一个数据网格来导航员工。但在每个员工行中,我想显示他们工作的公司的名称(如果有关系),如果没有相关公司记录,则显示“失业”的名称 我没有给出表的详细信息,因为它实际上并不重要——问题是在单个数据网格

我是WPF/C#/NET新手,但我一直在通过编写一些小练习来学习

不管怎样,我被卡住了。我在这里和谷歌上搜索过,但找不到答案,或者更准确地说,找不到我能理解的答案

我的问题是。。。使用实体框架,我有两个表。一个用于员工详细信息,一个用于公司详细信息。员工为0或1家公司工作

我想通过WPF/XAML定义一个数据网格来导航员工。但在每个员工行中,我想显示他们工作的公司的名称(如果有关系),如果没有相关公司记录,则显示“失业”的名称

我没有给出表的详细信息,因为它实际上并不重要——问题是在单个数据网格中显示来自父/子关系的具体信息

我不知道解决这类问题的最佳方法是什么,我假设使用WPF/DataGrid,因此我非常感谢您对如何进行这项工作、绑定(假设使用WPF)甚至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}" ...