كيف يعمل ObservableCollection<T>.Add؟
-
14-11-2019 - |
سؤال
كنت أحاول تنفيذ مجموعة متخصصة تعمل مثل ObservableCollection
لتغليف المزيد من الآليات فيه، وللقيام بذلك، تركت مجموعتي ترث منه أيضًا Collection
وأقوم أيضًا بتنفيذ نفس الواجهات.
أنا لا أفهم كيف يمكن للمرء أن ينفذ فعليًا منطق تغيير المجموعة بالكامل، على سبيل المثال Collection<T>.Add
لم يتم تجاوزه (لم يتم وضع علامة عليه على أنه افتراضي)، فكيف يمكن لـ ObservableCollection
أطلق النار على CollectionChanged
الحدث إذا تمت إضافة العناصر باستخدام هذه الطريقة؟
المحلول
للإجابة على سؤالك المحدد، Collection<T>.Add
يدعو InsertItem
الطريقة الافتراضية (بعد التأكد من أن المجموعة ليست للقراءة فقط). ObservableCollection<T>
في الواقع يتجاوز هذه الطريقة للقيام بالإدراج و رفع إشعارات التغيير ذات الصلة.
نصائح أخرى
يفعل ذلك عن طريق الاتصال InsertItem
والذي تم تجاوزه ويمكن رؤيته عند إلغاء الترجمة
protected override void InsertItem(int index, T item)
{
this.CheckReentrancy();
base.InsertItem(index, item);
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index);
}
تذكر أن المفتاح ليس في تجاوز طرق التجميع الأساسية، بل في حقيقة أنك ستقوم بتنفيذ واجهة ICollection.وبصراحة، بدلاً من الوراثة من فئة المجموعة، أود أن أقترح بدلاً من ذلك إنشاء فئة محول تأخذ ICollection في المنشئ وسوف تقوم أساليبك فقط بتفويض المجموعة الداخلية ورفع الأحداث المناسبة.