Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf ViewModel应该如何与存储库交互?_Wpf_Data Binding_Mvvm_Repository Pattern_Observablecollection - Fatal编程技术网

Wpf ViewModel应该如何与存储库交互?

Wpf ViewModel应该如何与存储库交互?,wpf,data-binding,mvvm,repository-pattern,observablecollection,Wpf,Data Binding,Mvvm,Repository Pattern,Observablecollection,我正在学习使用MVVM构建应用程序,我有以下情况: ViewModel应显示检查类型的对象列表。此列表将被数据绑定到视图中的列表视图,并从中进行筛选,用户将选择activeexamice以供进一步使用 “驻留”在模型层中的存储库应“作为域对象的内存集合”,并在ViewModel中实例化 现在我的问题是:存储库应该是要数据绑定到视图的集合,还是应该只是实现INPC的属性的“数据源”?例如,从下列可能性来看,其中一个是正确的,另一个是错误的,或者两者都是错误的 // example where

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

  • ViewModel应显示
    检查类型的对象列表。此列表将被数据绑定到视图中的
    列表视图
    ,并从中进行筛选,用户将选择
    activeexamice
    以供进一步使用
  • “驻留”在模型层中的存储库应“作为域对象的内存集合”,并在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();
//列表被替换以进行更改的示例;
//ViewModel类(它的一部分)
公共类ThisViewModel:ViewModelBase{
公共列表检查列表{
获取{return\u检查列表;}
设置{u检查列表=值;
NotifyOfPropertyChange(“检查列表”);}
}
}
var repo=新检查存储库();
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"); }
    }
}
//属性本身就是存储库的示例
//ViewModel类(它的一部分)
公共类ThisViewModel:ViewModelBase{
//该列表实际上是一个伪装的存储库。
IEnumerable_检查列表=新建检查存储库();
公共列表检查列表{
获取{return\u检查列表;}
设置{u检查列表=值;
//这应该是“集合更改通知”,我想。。。
NotifyOfPropertyChange(“检查列表”);}
}
}

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

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


感谢您的建议!

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

这样做的主要原因是允许我们在应用程序中连接不同的层,这样我们就可以独立地测试每一层。如果您没有这样做的要求,那么这可能就不那么重要了

我一直想知道为什么Microsoft在自动生成的类中实现了
INotifyPropertyChanged
INotifyPropertyChanging
接口(例如来自Linq2SQL)当在UI中直接使用这些类时,它们会打破层与层之间的分离,而层与层之间的分离是它们自己总是告诉开发人员要遵守的

更新>>>

我想说的是,对于一个小应用程序来说,如何和在哪里做这些事情并不重要。有时候,在编写一个真正的小应用程序时,我甚至不需要麻烦使用MVVM。创建层和/或实现MVVM文件夹结构都会增加额外的开发时间和额外的代码,我觉得它们只有在以下情况下才有用:

a) 将单独测试应用程序的各个层,或者


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

“如何在WPF/MVVM数据绑定环境中正确处理可变的、基于repository的集合“---你为什么希望它是可变的?你不希望它是不变的吗?这取决于你想如何使用检查列表,是否只是显示数据库中的数据,而用户没有能力将项目添加回数据库?@LeoLorenzoLuis我用更多的上下文编辑了这个问题。然后我要做的是创建一个ObservableCollection属性并延迟加载backing属性以获取数据库中的项目,并且,在添加/编辑/删除集合中的任何后续项时,都将得到正确处理。层的分离很好,只需在ViewModel中正确使用即可。我不同意Sheridan的回答,即您应该始终在UI中填充/显示单独的集合。不,不,不。@LeoLorenzoLuis非常感谢。还有一个疑问:您提到了“延迟加载becking属性”和“任何后续项目都将被正确引导”。它是通过
ObservableCollection
本身来实现的,还是应该重写或实现代码,还是应该将代码放入setter/getter。。。?仍然有点困惑…它不是由类实现的,而是由您自己实现的。就像这个公共的ObservableCollection Patients{get{if({u Patients==null){{u Patients=//在这里调用存储库}return{u Patients;}然后在代码的其他部分调用Patients.Add或something或Remove,这些都是内置的