WPFアプリケーションがあります。たとえば、Departmentオブジェクトがあり、その中にコースのObservableCollectionがあり、各コース内にObservableCollection of Teachersがあり、各Teacher内にObservableCollectionofStudentがあります。
Department.cs----ObservableCollectionコース
Course.cs----ObservableCollection教師
Teacher.cs----ObservableCollectionの学生
Student.cs ----名前、年齢など
これらの4つのクラスはすべてINotifyPropertyChangedを実装し、それ自体で正常に機能しています。私が達成したいのは、Departmentオブジェクトグラフ内の何かが変更されたとき、学生の年齢が変更されたとき、新しいコースが追加されたとき、教師が削除されたときなどです。とにかく、私はそれについて知りたいのですが、理想的にはDepartmentChangedのようなイベントを介して(そして理想的にはこれは一度だけ発生します)、他の長期的なアクションを呼び出すことができます。
私はそれを行うためのクリーンな方法を思い付くのに苦労しています。INotifyPropertyChangedはクラスのプロパティ変更のみを追跡し、ObservationCollectionはそのアイテムの1つが何かを変更したかどうかを認識しないことを理解しています。
これまでのところ、(擬似コード)のようなネストされたループを試しました:
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で実行したいアクションが何度も実行されることになり、これは悪いことです。
次に、間隔を500に設定してタイマー(各クラスにIsDirty()があり、オブジェクトが変更されたかどうかを判断します)を使用してみました。
if(department != null && department.IsDirty()){
//call some long running Action here
}
これはうまくいくように見えますが、どういうわけかこのアプローチは間違っていると感じています。可能であればタイマーを避けたいので、他の提案やアイデアを聞きたいです!
ありがとう、