我们有一个 WPF 应用程序,假设我有一个 Department 对象,其中我有一个 ObservableCollection 课程,在每门课程中我有一个 ObservableCollection 教师,在每个教师中我有一个 ObservableCollection 学生:
Department.cs ---- ObservableCollection 课程
Course.cs ---- ObservableCollection 教师
Teacher.cs ---- ObservableCollection 学生
Student.cs ---- 姓名、年龄等
这4个类都实现了INotifyPropertyChanged,它们自己工作正常,我想要实现的是每当Department对象图中的任何内容发生变化时,无论是学生的年龄发生变化,还是添加新课程或移除老师,任何事情完全,我想知道它,理想情况下是通过像 DepartmentChanged 这样的事件(理想情况下这只引发一次),所以我可以调用其他一些长期运行的操作。
我很难想出一个干净的方法来做到这一点。我了解 INotifyPropertyChanged 仅跟踪类的属性更改,而 ObservationCollection 不知道其项目之一是否发生了更改。
到目前为止,我尝试了类似(伪代码)的嵌套循环:
foreach (var course in d.Courses){
foreach (var teacher in course.Teachers){
foreach (var student in teacher.Students){
((INotifyPropertyChanged)student).PropertyChanged += ...
}
teacher.Students.CollectionChanged += ...
}
}
但是可以想象,这创建了很多 PropertyChanged 事件,因为每个属性都订阅了它,而我想在 Department 中执行的操作最终被执行了很多次,这很糟糕。
然后我尝试使用计时器(我们的每个班级都有一个 IsDirty() 来确定对象是否已更改),时间间隔设置为 500:
if(department != null && department.IsDirty()){
//call some long running Action here
}
虽然这似乎可行,但不知何故我觉得这种方法是错误的,如果可能的话,我真的很想避免使用计时器,我很想听听其他建议和想法!
谢谢,