【发布时间】:2010-11-26 20:56:13
【问题描述】:
在我的 AdministrationController 中,我使用 PupilViewModel,例如:
_adminRepo.GetSchoolclassPupilList().ForEach(s =>
{
SchoolclassViewModel sVM = new SchoolclassViewModel(s, _adminRepo);
foreach (PupilViewModel pVM in sVM.PupilListViewModel)
{
pVM.Documents.DeleteDocumentDelegate += new Action<List<Document>>(OnDeleteDocument);
pVM.Documents.AddDocumentDelegate += new Action(OnAddDocument);
pVM.Documents.OpenDocumentDelegate += new Action<int, string>(OnOpenDocument);
}
SchoolclassList.Add(sVM);
});
PupilViewModel 就是这样创建的:
public SchoolclassViewModel(Schoolclass schoolclass, IAdministrationRepository adminRepo)
{
_schoolclass = schoolclass;
_adminRepo = adminRepo;
PupilListViewModel = new ObservableCollection<PupilViewModel>();
schoolclass.Pupils.ForEach(p => PupilListViewModel.Add(new PupilViewModel(p, _adminRepo)));
}
您肯定注意到 PupilViewModel 在其构造函数中采用 2 个参数。 重要的是第二个参数,它是一个服务/存储库,具体是它的 IAdministrationRepository 实例。
现在存在另一个名为 IncidentReportingController 的 Controller。 在其构造函数中,我执行与 AdministrationController 中相同的操作:
// When I now try to wrap my pupils into a ViewModel I have a problem:
IEnumerable<Pupil> pupils = incidentRepo.GetPupilIncidentReportDocumentList();
PupilViewModels = new ObservableCollection<PupilViewModel>(pupils.Select(p => new PupilViewModel(p, ???)));
A.) 我不想将 Service 传递给 PupilViewModel,因为没有理由更新 PupilViewModel 中的属性,因为它在 View 中是只读的。
B.) 在我的AdministrationController 中,我从Aggregation 的服务中获取数据:
1 Schoolclass 有 N Pupils 和 1 Pupil 有 N Documents。这些实体被包裹在
SchoolclassViewmodels、PupilViewModels 和 DocumentViewModels...
现在在我的IncidentController 中,我也从服务中获取数据,我的Aggregation 非常相似:
1 个Pupil 有N 个IncidentReports,1 个IncidentReport 有N 个Documents。这些实体被包裹在
PupilViewModels、IncidentReportViewModels、DocumentViewModels...
问题是 => 在 PupilViewModel 类中,它已经包装了一个 DocumentListViewModel。现在我需要再次使用 PupilViewModel 来包装 IncidentReportListViewModel,然后我再次有 1 个 Pupil 有 1 个 SeatingChair 并再次包装它们。这意味着我必须将三个服务传递给 PupilViewModel,尽管我并不总是需要它们。
我很难直截了当地解决这个问题,但不知何故我觉得这不是正确的方法。
那么我如何重用相同的 ViewModel,它包装了具有不同服务的不同聚合的实体?
【问题讨论】:
标签: wpf mvvm viewmodel reusability