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)