【问题标题】:WPF/MVVM - should we create a different Class for each ViewModel?WPF/MVVM - 我们应该为每个 ViewModel 创建一个不同的类吗?
【发布时间】:2011-03-02 20:43:45
【问题描述】:

我正在尝试 MSDN 中 Todd Miranda 为 MVVM 编写的出色的“我如何”视频中的示例。

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

  1. 在示例中,他有一个名为 EmployeeListViewModel 的 ViewModel。现在,如果我想包含部门,是否应该创建另一个 ViewModel,例如 DepartmentListViewModel

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

  3. 如果我想同时检索员工姓名和部门名称怎么办?我应该把方法放在哪里?

我对 WPF 和 MVVM 非常陌生,如果需要重新表述上述任何内容,请告诉我。

感谢您的所有帮助。

【问题讨论】:

标签: wpf architecture mvvm viewmodel


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    在问题 2 中,我有时要做的是检索和 IQueryable,然后将返回的对象“翻译”为 ViewModel。 Repositories/Domain 不应该对 ViewModel 一无所知,因为它只是一个展示的东西。

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

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

    希望这能澄清你的疑虑。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2020-05-08
        • 1970-01-01
        相关资源
        最近更新 更多