WPF / MVVM - 我们应该为每个ViewModel创建一个不同的类吗?

时间:2010-06-11 21:17:43

标签: wpf architecture mvvm viewmodel

我正在尝试从MSDN中发现的Todd Miranda的MVVM的优秀“我如何”视频中的示例。

我正在尝试根据我的学习目的调整示例。

  1. 在该示例中,他有一个名为 EmployeeListViewModel 的ViewModel。现在,如果我想要包含Departments,我应该创建另一个ViewModel,例如 DepartmentListViewModel 吗?

  2. 该示例将 EmployeeRepository 作为数据源。就我而言,我正在尝试使用Entity对象作为数据源( Model 文件夹中的 Employees.edmx EmployeeRepository.cs 中的 em> DataAccess 文件夹)。如果我想显示Departments列表,我应该创建一个名为 DepartmentRepository 的单独类,并将所有与部门相关的方法定义放在那里吗?

  3. 如果我想一起检索员工姓名及其部门名称怎么办?我应该在哪里放置这个方法?

  4. 我是WPF和MVVM的新手,如果有任何上述需要重新措辞,请告诉我。

    感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

是的,通常每个View(Page,Window,Screen)都应该拥有自己的ViewModel。因此,如果您想要一个列出一些员工的屏幕,您的ViewModel会将某种员工集合(IEnumerable)作为属性。然后,您的员工类型将包含其姓名,部门,电话分机(等)的属性。

我不清楚您的问题是否要在同一页面上显示员工和部门列表。如果您正在尝试这样做,那么您的ViewModel中有两个属性,它们是某种类似的集合:

public class EmployeeListViewModel {
     public IEnumerable<Employee> Employees { get; set; }
     public IEnumerable<Department> Departments { get; set; }
}

...这将允许您在视图上显示两个集合。

答案 1 :(得分:1)

这取决于,因为每个模式都比你需要严格遵循的东西更像是和想法/概念。通过这样说,您会注意到有时是的,建议为每个ViewModel使用一个类,或者如果适用,可以使用通用的ViewModel。 我知道这很难,因为我(现在仍然是)与你的位置相同。

在问题2中,我有时做的是检索和IQueryable,然后将返回的对象“转换”为ViewModel。 Repositories / Domain对ViewModels一无所知,因为它只是一个演示文稿。

回答第3点,如果你需要将一个控件与Employee和Departments绑定在一起, 也许你可以这样做:

public class EmployeeDepartmentsViewModel : BaseViewModel //Base View Model has INPC stuff
{
    public Employee Employee { get; set; }
    public Department Department { get; set; }
}

希望这能澄清你的疑虑。

答案 2 :(得分:1)

这里没有严格的规则。我将逐一解决每个问题:

  1. 您拥有的每个唯一视图都有一个ViewModel。我认为调用它[Entity] ListViewModel可能会混淆这个问题。将其命名为视图的名称...如果您正在查看DepartmentDashboard,请将其命名为DepartmentDashboardViewModel。
  2. 对于您的模型,没有规则,模型对象与视图模型对象的比例当然不一定是1:1:1。通常,在直接处理数据库(如TheBigDatabase.edmx)时,我有一个OR / M设置,这恰好由许多模型(员工,部门,帐户,交易等)组成。做任何在这里感觉良好的事情。
  3. 由于你要在其中创建一个包含多个实体的edmx(正如我在#2中所建议的那样),你将能够利用这些实体之间的关系(员工有部门,我猜,所以员工。部门会在那里)。完成后,如果愿意,您可以在一个地方显示相关数据。