我们有一个WPF应用程序,比方说我有一个Department对象,在这我有课的一个ObservableCollection,每门课程里面我有教师的一个ObservableCollection,每个老师里面我有学生的一个ObservableCollection:如何检测WPF中父对象的子项更改?
Department.cs ----的ObservableCollection课程
Course.cs ----的ObservableCollection教师
Teacher.cs ----的ObservableCollection学生
Student.cs ----姓名,年龄等
这4类都实现INotifyPropertyChanged的,他们正在通过自己很好,我想要实现的是无论何时处对象图中的任何改变,无论是是一个学生的年龄得到改变,或者一个新的课程或一个老师被删除,任何事情都是我想知道的,理想情况是通过一个像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事件,因为每个属性订阅的,动作,我想在系办最终被执行很多次,这是不好的。
然后我使用计时器尝试(我们每个班都有一个IsDirty()来确定对象是否改变)与间隔设置为500:
if(department != null && department.IsDirty()){
//call some long running Action here
}
虽然这似乎工作,不知何故,我觉得这种方法是错误的,我真的很想避免计时器,如果可能的话,我很想听听其他的建议和想法!
感谢,
任何更改并运行相同的长时间运行长过程。这个漫长的过程的性质是什么,你不能更具体一些,并处理财产集中的财产变化? – Paparazzi 2012-04-05 15:41:48
看看该实现的的[那的ObservableCollection还监视在集合中的元素的变化(http://stackoverflow.com/a/269113/620360)。 – LPL 2012-04-05 15:24:50
@LPL,谢谢,这篇文章看起来很有趣,我一定会更多地研究它。 – wliao 2012-04-05 18:10:12