Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# 具有外键列的Listview源(WPF MVVM)_C#_Wpf_Listview_Mvvm - Fatal编程技术网

C# 具有外键列的Listview源(WPF MVVM)

C# 具有外键列的Listview源(WPF MVVM),c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,我有两个可观察到的集合(员工-->FirstName,LastName,DepartmentFK/部门-->Id,Department)Employees包含一个外键(DepartmentFK),该外键链接到我的数据库表上的Id(departments表) 我想要的是显示所有员工,包括部门名称(而不是外键整数) 我的XAML如下所示: <ListView Name="Employees_Listview" ItemsSource="{Binding Employees, UpdateSou

我有两个
可观察到的集合
员工
-->FirstName,LastName,DepartmentFK/
部门
-->Id,Department)
Employees
包含一个外键(
DepartmentFK
),该外键链接到我的数据库表上的
Id
departments
表)

我想要的是显示所有员工,包括部门名称(而不是外键整数)

我的XAML如下所示:

<ListView Name="Employees_Listview" ItemsSource="{Binding Employees, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" Height="109">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}"/>
            <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}"/>
            <GridViewColumn Header="Departments" DisplayMemberBinding="{Binding DepartmentFK}"/>
        </GridView>
    </ListView.View>
</ListView>

因此,我的listview的源代码是
Employees
OC。由于我的viewmodel中有这两个集合,我希望有一种简单的方法来实现这一点


有人能告诉我怎么做吗?

说你的
员工
部门
课程是这样的:

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string DepartmentFK { get; set; }
}

public class Department
{
    public string ID { get; set; }
    public string Dept { get; set; }
}
然后,我将创建一个新的“display”类,该类将保存您想要显示的结果,即
FirstName
LastName
,以及
部门的对象
类:

public class DisplayEmployee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Department Dept { get; set; }
}
现在,您可以在
视图模型中筛选
员工
数据,并创建
显示员工
的列表:

Employees = new List<Employee>
{
    new Employee() { FirstName = "A", LastName = "Z", DepartmentFK = "D1" },
    new Employee() { FirstName = "B", LastName = "Y", DepartmentFK = "D2" },
    new Employee() { FirstName = "C", LastName = "X", DepartmentFK = "D1" },
    new Employee() { FirstName = "D", LastName = "W", DepartmentFK = "D3" },
    new Employee() { FirstName = "E", LastName = "V", DepartmentFK = "D2" }
};

Departments = new List<Department>
{
    new Department() { ID = "D1", Dept = "Department 01" },
    new Department() { ID = "D2", Dept = "Department 02" },
    new Department() { ID = "D3", Dept = "Department 03" },
    new Department() { ID = "D4", Dept = "Department 04" }
};

DisplayEmployees = new List<DisplayEmployee>();
foreach (var emp in Employees)
{
    DisplayEmployees.Add(
    new DisplayEmployee()
    {
        FirstName = emp.FirstName,
        LastName = emp.LastName,
        Dept = Departments.Where(x => x.ID == emp.DepartmentFK).FirstOrDefault()
    });
}
public class DisplayEmployee : Employee
{
    public Department Dept { get; set; }
}

编辑 您甚至可以将
DisplayEmployee
设置为
Employee
的派生类:

Employees = new List<Employee>
{
    new Employee() { FirstName = "A", LastName = "Z", DepartmentFK = "D1" },
    new Employee() { FirstName = "B", LastName = "Y", DepartmentFK = "D2" },
    new Employee() { FirstName = "C", LastName = "X", DepartmentFK = "D1" },
    new Employee() { FirstName = "D", LastName = "W", DepartmentFK = "D3" },
    new Employee() { FirstName = "E", LastName = "V", DepartmentFK = "D2" }
};

Departments = new List<Department>
{
    new Department() { ID = "D1", Dept = "Department 01" },
    new Department() { ID = "D2", Dept = "Department 02" },
    new Department() { ID = "D3", Dept = "Department 03" },
    new Department() { ID = "D4", Dept = "Department 04" }
};

DisplayEmployees = new List<DisplayEmployee>();
foreach (var emp in Employees)
{
    DisplayEmployees.Add(
    new DisplayEmployee()
    {
        FirstName = emp.FirstName,
        LastName = emp.LastName,
        Dept = Departments.Where(x => x.ID == emp.DepartmentFK).FirstOrDefault()
    });
}
public class DisplayEmployee : Employee
{
    public Department Dept { get; set; }
}

您不应该让您的
视图
执行
视图模型
工作。您应该创建一个自定义类来保存要显示的结果,并在
VM
中进行筛选。Sach所指的自定义类可能是一个包含所有员工属性的Employee viewmodel,以及一个引用部门对象的Department属性。然后,您可以绑定到
部门.Name
而不是
部门fk
。我确实有一个员工视图模型,其中包含所有属性,如LastName等,甚至还有部门名称,但我的源代码是ObservableCollection“Employees”,这个只有外键。所以我必须用Department.Name而不是外键创建一个新集合?(很抱歉这个可能是“愚蠢”的问题,但C#、WPF和MVVM对我来说是全新的)@Moritz您的
EmployeeViewModel
集合中的
EmployeeViewModel
应该有一个
Department
属性,它是对
Department
对象的引用。我不知道“用Department.Name创建一个新集合”是什么意思。@Ed尝试了Sach昨天发布的方法,它似乎起了作用,尽管我已经将所有内容都更改为ObservableCollection。我想多读几篇文章,一定有一种没有第三类的方法(DisplayEmployees)