Sunday, October 12, 2014

الفرق بين الـ List و الـ ObservableCollection

من المعروف عند ظهور الاصدار الثاني من تقنية الدوت نت أتى مفهوم ال Generics والذي اضاف ميزات وحل مشاكل كانت موجودة سابقا في الـ Collections, فبواسطته نقدر عمل هياكل بيانات حسب نوع معين وهذا سيوفر لنا ميزة الفحص اثناء وقت ترجمة البرنامج Compilation Time وسيقوم بإلغاء مشكلة ال Boxing والـ Unboxing الموجدتان سابقا قبل ظهور هذه التقنية, سنقوم في درسنا باستعراض احد انواع ال Collections ألا وهو الـ List ونوضح الفرق بينه وبين المجموعة الجديدة ObservableCollection.

List<T>

هي احد انواع الـ Generic Collection والتي تحتوي قائمة من الكائنات من النوع T حيث أن T هو نوع الكائن, وهذه القائمة يمكن الوصول لعناصرها بإستخدام الدليل. كما توفر اجراءات للبحث والترتيب و ومعالجة العناصر بداخلها. طبعا من المعروف عندما نريد اسناد مجموعة من العناصر ضمن List إلى أداة عرض مثل ال GridView نقوم بتحديدها كمصدر للمعلومات من ثم نطلق الاجراء Bind ليتم ربط البيانات وعرضها على الاداة, ولكن المشكلة اذا تم تحديث البيانات لايتم تحديث الأداة إلا إذا قمنا بنفس العملية السابقة من جديد!! ولكن هذا ليس عملي

فلو قمنا بعمل تطبيق WPF ومن ثم انشائنا الفئة Student على النحو التالي

Public Class Student
 Public Property Name As String
 Public Property Level As String
 Public Property Grade As Integer
End Class

فيتم تعريفها بالصورة التالية
Dim StudentsList As List(Of Student) = New List(Of Student) From
     {
         New Student() With {.Name = "Peter", .Level = "3rd", .Grade = 4},
         New Student() With {.Name = "Dave", .Level = "4th", .Grade = 3},
         New Student() With {.Name = "John", .Level = "3rd", .Grade = 1},
         New Student() With {.Name = "Samantha", .Level = "2nd", .Grade = 5},
         New Student() With {.Name = "Joseph", .Level = "1st", .Grade = 2}
     }
ObservableCollection<T>

هي نوع جديد من أنواع الـ Generic Collection والتي توفر خدمة الإشعار بإستخدام الواجهه INotifyCollectionChanged عند إضافة أو حذف أو إنعاش عناصرها. فهي تحل المشكلة السابقة في الـ List حيث إذا أستخدمت كمصدر معلومات وتم تحديث بياناتها يتم تحديث أدوات العرض تلقائيا الأمر الذي يجعل التعامل معها أمرا في غاية السهولة, كما توفر عناء الـ Bind في كل مرة يتم تحديث البيانات فيها, ويتم تعريفها بالصورة التالية
Dim StudentsObservableCollection As ObservableCollection(Of Student) = New ObservableCollection(Of Student) From
     {
         New Student() With {.Name = "Peter", .Level = "3rd", .Grade = 4},
         New Student() With {.Name = "Dave", .Level = "4th", .Grade = 3},
         New Student() With {.Name = "John", .Level = "3rd", .Grade = 1},
         New Student() With {.Name = "Samantha", .Level = "2nd", .Grade = 5},
         New Student() With {.Name = "Joseph", .Level = "1st", .Grade = 2}
     }

ولكنها لاتقوم بأي إشعار في حالة تغيير قيمة أي خاصية في المجموعة, لذا نقوم بإستخدام الواجهه INotifyPropertyChanged إذا اضطر الأمر, وفي المثال التالي يوضح كيفية التعامل مع هذه الواجهه
Public Class NotifyStudent
 Implements INotifyPropertyChanged

 Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

 Private Sub onPropertyChanged(ByVal sender As Object, ByVal propertyName As String)
     RaiseEvent PropertyChanged(sender, New PropertyChangedEventArgs(propertyName))
 End Sub

 Private _Name As String
 Private _Level As String
 Private _Grade As Integer

 Public Property Name As String
     Get
         Return _Name
     End Get
     Set(ByVal value As String)
         _Name = value
         onPropertyChanged(Me, "Name")
     End Set
 End Property
 Public Property Level As String
     Get
         Return _Level
     End Get
     Set(ByVal value As String)
         _Level = value
         onPropertyChanged(Me, "Level")
     End Set
 End Property
 Public Property Grade As Integer
     Get
         Return _Grade
     End Get
     Set(ByVal value As Integer)
         _Grade = value
         onPropertyChanged(Me, "Grade")
     End Set
 End Property

End Class

No comments:

Post a Comment