有VM类:
public class SyllabusVM
{
public string TitleSyllabus { get; set; } = string.Empty;
public List<SemestrVM>? Semesters { get; set; }
}
public class SemestrVM
{
public int Number { get; set; }
public List<DisciplineVM>? DisciplineS { get; set; }
}
public class DisciplineVM
{
public string Subject { get; set; } = string.Empty;
public int HoursLecture { get; set; }
public int HoursPractice { get; set; }
public string TypeOfControl { get; set; } = string.Empty;
}
对于 VM 模型类:
public class SyllabusModel
{
public string TitleSyllabus { get; set; } = string.Empty;
public List<SemestrModel>? Semesters { get; set; }
}
public class SemestrModel
{
public int Number { get; set; }
public List<DisciplineModel>? DisciplineS { get; set; }
}
public class DisciplineModel
{
public string Subject { get; set; } = string.Empty;
public int HoursLecture { get; set; }
public int HoursPractice { get; set; }
public string TypeOfControl { get; set; } = string.Empty;
}
我需要管理每个嵌套内的列表(添加、删除和更改),以及序列化和反序列化,我是否正确理解需要什么:
- 在上述虚拟机中,我不创建用于管理列表和序列化/反序列化的命令和逻辑,而是创建一个单独的 ViewModel,其中存在上述虚拟机上的业务逻辑 - 即。包装纸。
例子:
public class SyllabusViewModel : ReactiveObject
{
public ReactiveCommand<Unit,Unit> CreateSyllabucCommand { get; set; }
public ReactiveCommand<Unit,Unit> EditSyllabucCommand { get; set; }
public ReactiveCommand<Unit,Unit> DeleteSyllabucCommand { get; set; }
public ObservableCollection<SyllabusVM> Curriculum { get; set; }
public SyllabusViewModel()
{
Curriculum = new ObservableCollection<SyllabusVM>();
//МАПИНГ
foreach (var syllabus in serviceData.GetDataSyllabus())
Curriculum.Add(syllabus);
//МАПИНГ
CreateSyllabucCommand = ReactiveCommand.Create(CreateSyllabus);
EditSyllabucCommand = ReactiveCommand.Create(EditeSyllabus);
DeleteSyllabucCommand = ReactiveCommand.Create(DeleteSyllabus);
}
void CreateSyllabus() { }
void EditeSyllabus() { }
void DeleteSyllabus() { }
}
这样的 ViewModel 是上述每个 VM 的包装器。是否需要这些包装器或者该逻辑应该位于上述虚拟机中???
如何正确序列化此类嵌套。遍历顶层并通过 foreach-foreach-foreach 遍历每个嵌套,并将 VM 类型映射到模型中并序列化。或者每一层都必须自己进行映射。或者也许是其他东西,如果需要的话,可以理解嵌套和映射的序列化))。
每个课程表都是一个Json文件,插入到服务中的ICollection中,映射到SyllabusVM并返回
public ObservableCollection<SyllabusVM> Curriculum { get; set; }.
每层是否都需要为其自己的列表进行此类映射,或者应该仅在嵌套的最顶层进行映射,在几个 foreach-foreach-foreach 循环中完成整个嵌套???
请告诉我)))
可怜那些读者吧……
SyllabusVM.TitleSyllabus
他们随着口哨翻白眼,上下文比以往任何时候都更糟糕。没有必要把它写Model
在名称中,这从对象中已经很清楚了,名称中没有业务逻辑和任何其他关键字。模型不是为视图而存在,但视图是为模型而存在。当他们写
для
它时,它表明了一个与另一个的关系,但在你的情况下,*VM
它与任何事情都没有关系,这些只是愚蠢的克隆*Model
,尽管它应该是它的包装。我对这个不恰当的问题表示歉意,但这
VM
不是缩写吗ViewModel
?与一个或一组几个互动ViewModel
,任务View
!不存在这样的事情
вложенность
,这不是标记,一个对象(例如一门学科)不能嵌套在其他几个(学期)中,它只能被一个对象引用(几个学期引用同一个学科)。这称为关系/关系,具有相关数据的数据库称为реляционными
(Relational
)。它为您提供什么功能
ViewModel
?ViewModel
这是一个包装Model
。例如,如果Model
有url
图像,则ViewModel
可能有byte[]
从此链接下载的图像,以便可以在 中显示View
。一个ViewModel
甚至可能同时是多个的产物Model
。ViewModel
它只是一个不包含重要数据的中介,其中没有任何可序列化的内容,并且从“最终”一词来看,它不参与保存数据的主题。您面临的问题是,如果几个学期引用一门学科,那么在序列化/去萨尔化过程中,这些学期开始引用同一学科的不同副本,因为它们之间的关系没有保留,只保留了结构和价值观。
正如显示它的人
Model
不知道它的存在一样View
,它也不应该知道保存/加载的存在。保存/加载是始终单独描述的逻辑,它不在模型中,也不在视图中,也不在任何东西中,它是独立的。作为ViewModel
的中介View
,还可以有一个存储数据的中介。SemestrData
很容易连载,Json
没有任何参考文献,只有学科名称。它本身
LernData
被序列化为Json
一组保持完整性的相互依赖的数据的容器。您只需要一个类,您可以向该类提供计划、学期和学科,以便进一步打包在包装器和容器中
LernData
及其序列化,以及使用包装器中的数据进一步恢复实体之间的连接的反序列化。