1

我正在学习使用 MVVM 构建应用程序,我有以下情况:

  • ViewModel 应该显示类型为 的对象列表Examination。该列表将被数据绑定到ListView视图中的一个,从那里它会被过滤,用户将选择它以ActiveExamination供进一步使用。
  • “存在”在模型层中的存储库应该“表现为域对象的内存中集合”,并在 ViewModel 中实例化。

现在我的问题是:存储库应该是数据绑定到视图的集合,还是应该只是实现 INPC 的属性的“数据源”?例如,从以下可能性中,其中一个是正确的,另一个是错误的,还是两者都错误......?

// example where the list is replaced in order to be changed;

// ViewModel class (part of it)
public class ThisViewModel : ViewModelBase {
    public List<Examination> ExaminationList {
        get { return _examinationList; }
        set { _examinationList = value;
              NotifyOfPropertyChange("ExaminationList"); }
    }
}


var repo = new ExaminationRepository();
ThisViewModel.ExaminationList = repo.getAll().where(ex => ex.Value > 20).ToList();

第二种选择

// Example where the very property IS a repository

// ViewModel class (part of it)
public class ThisViewModel : ViewModelBase {

    // the List is actually a repository in disguise.
    IEnumerable _examinationList = new ExaminationRepository();

    public List<Examination> ExaminationList {
        get { return _examinationList; }
        set { _examinationList = value;
              // This should be "NotifyOfCollectionChange", I guess...
              NotifyOfPropertyChange("ExaminationList"); }
    }
}

很可能我在这里很困惑/错误,但是我的应用程序在架构方面相当小且简单,而且我真的不打算使用我见过的与此类问题相关的大多数框架和高级概念(ORM、IoC、 DI),相反,我最关心的是“如何在 WPF/MVVM 数据绑定环境中正确处理可变的、基于存储库的集合”。

编辑:关于我的应用程序的一些上下文:该应用程序是执行临床检查的应用程序。它有一个患者列表,每个患者都有自己的检查。有一个患者存储库和一个检查存储库。当我在 PatientList 中选择一个患者时,该患者的 ExamsList 会显示来自考试 repo 的匹配考试。用户对患者和检查的操作是 CRUD,或者最具体的 BREAD(浏览、阅读、编辑、添加和删除)。

感谢您的任何建议!

4

1 回答 1

2

在我看来,为了在大型应用程序中实现最佳分离,您应该始终使用单独的集合从数据库中填充,然后在 UI 中显示。这确实意味着您必须对集合进行两次迭代,但这在 WPF 中通常是必需的,因为我们喜欢为 UI 添加额外的显示属性,例如IsSelectedIsFocused(如果我们正在填充视图模型对象)。

这样做的主要原因是允许我们在应用程序中连接我们的各个层,以便我们可以独立地测试每个层。如果您没有要求这样做,那么也许它并不那么重要。

我一直想知道为什么微软在他们的自动生成的类(例如来自 Linq2SQL)中实现INotifyPropertyChangedINotifyPropertyChanging接口,而在 UI 中使用这些类直接打破了他们自己总是告诉开发人员遵守的层之间的分离。

更新>>>

我会说,对于一个小型应用程序,你如何以及在哪里做这些事情并不重要。有时在编写一个非常小的应用程序时,我什至不费心使用 MVVM。创建层和/或实现 MVVM 文件夹结构都会增加额外的开发时间和额外的代码,我觉得它们只有你使用时才有用;

a) 将分别测试您的应用程序的各个层,或

b) 可能在未来的某个阶段需要“换出”一个或多个层,例如。例如,从SQL数据库移动到Oracle数据库,或从 WPF UI 移动到基于 Web 的 UI。

于 2013-10-07T14:26:43.330 回答