我們有一個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