[[Template core/front/global/updateWarning is throwing an error. This theme may be out of date. Run the support tool in the AdminCP to restore the default theme.]]
من المعروف عند ظهور الاصدار الثاني من تقنية الدوت نت أتى مفهوم ال 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 إذا اضطر الأمر, وفي المثال التالي يوضح كيفية التعامل مع هذه الواجهه
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
تم النشر منذ (معدل)
السلام عليكم ورحمه الله وبركاته
من المعروف عند ظهور الاصدار الثاني من تقنية الدوت نت أتى مفهوم ال 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 إذا اضطر الأمر, وفي المثال التالي يوضح كيفية التعامل مع هذه الواجهه
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
ولقد ارفقت مشروع لتوضيح الفكرة لهذا الدرس
WpfApplication1.zip
شارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه