0

我学习建立使用MVVM的应用程序,我有以下情况:ViewModel应该如何与存储库交互?

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

现在我的问题是:如果存储库BE集合是数据绑定到视图,或者它应该只是实现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数据绑定环境中正确处理基于可变的,基于reppository的集合”。

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

感谢您的任何建议!

+0

“如何在WPF/MVVM Databinding环境中正确处理基于可变的,基于reppository的集合”---为什么要让它变得可变?你不想让它变成一成不变吗?这取决于您想如何使用ExamList的情况,是否仅仅显示数据库中的数据,而用户无法将项目添加回数据库? –

+0

@LeoLorenzoLuis我用更多的上下文编辑了这个问题。 – heltonbiker

+0

然后我会做的是使一个ObservableCollection 属性和延迟加载支持属性来获取数据库中的项目,并且任何后续项目集合将被正确处理,当他们添加/编辑/删除。你的图层分离很好,你只需要在ViewModel中正确使用它。我不同意Sheridan的回答,你应该总是有单独的集合来填充/显示在UI中。没有什么不可以。 –

回答

2

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

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

我一直在想,为什么微软在自己生成的类(例如Linq2SQL)中实现了INotifyPropertyChangedINotifyPropertyChanging接口,当在UI中使用这些类时,直接打破了它们自己始终告诉开发人员遵守的层之间的分离至。

UPDATE >>>

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

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

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

+0

这是否意味着我的第一个代码块是足够的?我的应用程序非常小巧,而且我不确定我是否理解你的考虑(我还没有太多关于数据绑定集合的经验)。 – heltonbiker

+0

是的,我会用你的第一个例子。我经常把我的数据访问代码放入一个名为'Refresh'的方法中,这个方法在构造函数中被调用,然后给用户一个'Command',用来调用这个方法,例如。用户可以通过点击UI中的'Button'来刷新每个视图中的数据,这个'Button'绑定到'Command',它在内部调用'Refresh'方法。 – Sheridan