من المعروف عند ظهور الاصدار الثاني من تقنية الدوت نت أتى مفهوم ال
Generics والذي اضاف ميزات وحل مشاكل كانت موجودة سابقا في الـ
Collections, فبواسطته نقدر عمل هياكل بيانات حسب نوع معين وهذا سيوفر لنا
ميزة الفحص اثناء وقت ترجمة البرنامج Compilation Time وسيقوم بإلغاء مشكلة
ال Boxing والـ Unboxing الموجدتان سابقا قبل ظهور هذه التقنية, سنقوم في
درسنا باستعراض احد انواع ال Collections ألا وهو الـ List ونوضح الفرق
بينه وبين المجموعة الجديدة ObservableCollection.
List<T>
هي احد انواع الـ Generic Collection والتي تحتوي قائمة من الكائنات من النوع T حيث أن T هو نوع الكائن, وهذه القائمة يمكن الوصول لعناصرها بإستخدام الدليل. كما توفر اجراءات للبحث والترتيب و ومعالجة العناصر بداخلها. طبعا من المعروف عندما نريد اسناد مجموعة من العناصر ضمن List إلى أداة عرض مثل ال GridView نقوم بتحديدها كمصدر للمعلومات من ثم نطلق الاجراء Bind ليتم ربط البيانات وعرضها على الاداة, ولكن المشكلة اذا تم تحديث البيانات لايتم تحديث الأداة إلا إذا قمنا بنفس العملية السابقة من جديد!! ولكن هذا ليس عملي
فلو قمنا بعمل تطبيق WPF ومن ثم انشائنا الفئة Student على النحو التالي
ولكنها لاتقوم بأي إشعار في حالة تغيير قيمة أي خاصية في المجموعة, لذا نقوم بإستخدام الواجهه INotifyPropertyChanged إذا اضطر الأمر, وفي المثال التالي يوضح كيفية التعامل مع هذه الواجهه
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 في كل مرة يتم تحديث البيانات فيها, ويتم تعريفها بالصورة التالية
هي نوع جديد من أنواع الـ 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