ב-TechEd Eliat 2006 הרצאתי על Data Binding הסברתי את התהליך הנדרש על מנת לעבוד עם אובייקטים משלנו ב - Data Binding מורכב, כמו למשל עם DataGridView. התהליך אינו פשוט ומצריך לממש מספר רב של ממשקים כדי לקבל את כל היכולות. להל"ן הממשקים:
1. ממשקים ברמת האוביקט:
INotifyPropertyChanged - IEditableObject
- IDataErrorInfo
DataRowView הוא דוגמא לאובייקט שמממש את כל הממשקים.
2. ממשקים ברמת ה-Collection :
- IEnumerable
- ICollection
- IList
- IBindingList
- IBindingListView
DataView הוא דוגמא לאובייקט שמממש את כל הממשקים.
הממשק IBindingListView מממש את כל שאר הממשקים ולמעשה הוא נותן לנו את היכולות של מיון, מיון מורכב, חיתוך וחיפוש.
מימוש ממשק זה מורכב ולכן רוב המפתחים מוותרים ונשארים עם DataSet.
מה השתנה ב- WPF
למזלנו מיקרוסופט שחררה אותנו מ
מימוש של IBindingListView ונותנת לנו מחלקה שעושה את העבודה טוב. אך אי אפשר להשתמש איתה באפלקציה חלונאית רגילה כי היא לא מממשת את הממשק IBindingListView או IBindingList.
ממשק נולד
ICollectionView הוא הממשק החדש שהפקדים של WPF מצפים לעבוד מולו כדי לתת לנו את היכולות של מיון, חיתוך וקיבוץ (קיבוץ לא היה קיים באפלקציה חלונאית). אך למזלנו אנחנו לא צריכים לממש אותו. המחלקה CollectionView או ListCollectionView עושות את העבודה בשבילנו.
אפשר ליצור את CollectionView על כל Collection שמממש את IEnumerable.
CollectionView view = new CollectionView ( col );
הבעיה שדרך CollectionView אי אפשר להוסיף או להוריד איברים. את הפתרון לבעיה זו נותן לנו ListCollectionView שמחייב את ה- Collection לממש את הממשק IList.
ListCollectionView view = new ListCollectionView( col );
עם איזה מחלקה של Collection כדי לעבוד?
WPF מציג לנו תחליף ל-BindingList<T> שהוא ObservableCollection<T>, המיוחד בו שהוא מממש את הממשקים INotifyCollectionChanged ו- INotifyPropertyChanged שהם מדווחים לפקדים על כל שינוי שמתבצע ב-Collection .
רוצים לראות
דוגמאות קוד
ניתן להוריד סדרה של דוגמאות מ-SDK. לנוחיות הקהל
סידרתי אותם ע"פ מספרים שיהיה קל יותר לעקוב אחרי ההתקדמות. (להורדה לחץ כאן).
האם ניתן להשתמש במחלקות החדשות ש- WPF נותן לנו כדי להשתמש בהם באפלקציה חיצונית? במילים אחרות במקום לממש את IBindingListView?
התשובה הראשונית לא. המודל באפליקציה חלונאית היכולות של חיתוך, מיון וחיפוש מתבצעות על המידע עצמו ולא על העתק, לכן IBindingListView מממש את כל הממשקים שהזכרתי קודם. הממשק החדש ICollectionView לא מממש אותם, לכן פתרון פשוט שלוקח את ListCollectionView ולחבר אותו ל- DataGridView לא ייתן לנו את התוצאה הרצויה. מה שנדרש לעשות הוא לבנות מחלקה שמממשת את IBindingListView, כלומר את כל הממשקים, אבל כדי לבצע חיתוך או מיון נשתמש בתוך המחלקה במחלקה ListCollectionView.
דוגמא פשוטה של הקוד ניתן להוריד כאן.