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

问题描述:

我正在尝试从MSDN中的Todd Miranda的MVVM出色的“How Do I”视频中获得示例。WPF/MVVM - 我们应该为每个ViewModel创建一个不同的类吗?

我正在尝试改编我的学习目的的例子。

  1. 在这个例子中,他有一个视图模型称为EmployeeListViewModel。现在如果我想包含部门,我应该创建另一个ViewModel,如DepartmentListViewModel

  2. 该示例具有EmployeeRepository作为数据源。在我的情况,我想(在数据访问文件夹Employees.edmx型号文件夹和EmployeeRepository.cs)使用一个实体对象作为数据源。如果我想显示部门列表,我应该创建一个名为DepartmentRepository的单独类,并将所有与部门相关的方法定义放在那里?

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

我对WPF和MVVM非常陌生,请让我知道是否需要重新说明上述任何内容。

谢谢你的帮助。

+0

类似于http://*.com/questions/2790230/with-mvvm-does-each-ui-window-have-its-own-viewmodel/2790248#2790248 – 2010-06-11 21:20:46

这取决于,因为每种模式更像是和想法/概念,而不是你需要严格遵循的事情。通过这样说,你会注意到有时候是,对每个ViewModel使用一个类是可取的,或者如果适用,可以使用通用ViewModel。 我知道这很难,因为我是(现在还是我)和你一样。

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

应答点3,如果你需要绑定与员工和部门联合控制, 也许你可以做这样的事情:

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

希望这阐明你的疑虑。

是的,通常每个视图(页面,窗口,屏幕)应该有它自己的ViewModel。所以,如果你想要一个列出一些员工的屏幕,你的ViewModel会有一些员工集合(IEnumerable)作为属性。然后,您的员工类型将包含他们的姓名,部门,电话分机(等)的属性。

我不完全清楚您的问题是否要在同一页面上显示员工和部门的列表。如果这是你正在尝试做的,那么你就必须在你的视图模型的两个属性是某种藏品是这样的:

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

...这将让您对您的视图中显示两个集合。

这里没有硬性规定。我将分别解决每个问题:

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