WPF תיבה משולבת בדטה-גריד
-
לא, אני לא יודע כרגע.
גם ראיתי שיש DataGridComboBoxColumn אז אולי עדיף להשתמש בו במקום ב TemplateColumn ?נכון, לגמרי שכחתי.
תמיד עדיף לחסוך אז אם אין לך דרישות מיוחדות תשתמש בו.
ההגדרות הדרושות במרבית המקרים הם הללו:
[u:j23yn1zl]א. הגדרות התיבת רשימה ברמת הפקד, אחיד לכל השורות.[/u:j23yn1zl]- ItemsSource = מקור השורות של הרשימה.
- במידה והתצוגה הנדרשת היא לא האובייקט כולו אלא חלק ממנו,
למשל רשימה של אובייקטים מסוג Person ורוצים שהתצוגה תרנדר כל פריט לפי מאפיין Name שנמצא באובייקט.
במקרה כזה צריך להשתמש בDisplayMemberPath ולקבוע בו את שם המאפיין.
[u:j23yn1zl]ב. הגדרות ברמת שורה:[/u:j23yn1zl]
כעת מה שחשוב זה לקבוע מה הערך הנבחר = על איזה נתון ברמת השורה הוא מושפע ומשפיע.
ישנם שתי דרכים. במידה וItemsSource מכיל איברים בני אותו הסוג של השדה ברמת השורה,
יש להשתמש עם SelectedItemBinding בו יש לקבוע את האיגוד מרמת השורה. יש לשים לב שזה בינדינג לכל דבר: בחירה מהרשימה תכתוב לתוך הערך ולהיפך.במידה והשדה מהשורה הוא מסוג אחר מסוג הפריטים ברשימה, למשל ID של האובייקט, שזה מספר ולא אובייקט,
יש לקבוע
א. SelectedValuePath בו נקבע איזה שדה מתוך האובייקט נחשב הערך הנבחר.
ב. SelectedValueBinding שזה איגוד מהשדה ברמת השורה לערך הנבחר (ה"ערך" נחשב השדה שנכתב בSelectedValuePath. אם לא נכתב שדה, אז זה מחזיר את כל האובייקט בדומה לאפשרות א).פורסם במקור בפורום CODE613 ב19/12/2013 13:58 (+02:00)
-
יישמתי את הכל בהצלחה, רק שקרתה משום מה בעיה מוזרה, כאשר אני לוחץ על ראש הדטה-גריד כדי למיין את העמודה של המשולבות כל הערכים נאלמים כלא היו!
אפרט יותר:
- יש לי אוסף של אנשי קשר, ואוסף של הזמנות. כל אוסף מוצג בדטה-גריד אחר.
- בדטה-גריד שמציג את אוסף ההזמנות עשיתי את העמודה הנ''ל עם המשולבות.
- כל משולבת מציגה את הרשימה המלאה של אנשי הקשר כי הגדרתי את ItemsSource של עמודה זו לאוסף של אנשי הקשר.
- הגדרתי כמו שהסברת את SelectedValuePath ואת SelectedValueBinding, ואחר בחירת איש קשר במשולבת - שם האיש קשר מופיע בתא.
אולם לאחר שאני ממיין את העמודה של המשולבות כל התאים בעמודה הופכים להיות ריקים!
פורסם במקור בפורום CODE613 ב19/12/2013 18:04 (+02:00)
-
אחר כך ראיתי שאע''פ שהכל מוצג כשורה יש כאן שגיאה שעשיתי, והיא:
ש SelectedValueBinding הגדרתי עם שם מאפיין מהטיפוס של שורה במשולבת, ולא מטיפוס של שורה בדטה-גריד כך, שלמעשה כאשר בחרתי משהו במשולבת בחירה זו לא נשמרה בשום מקום רק הוצגה זמנית הדטה-גריד ולכן בשעת המיון הכל נאלם כי ערכים אלו לא היו קיימים בתוך האוסף המוצג בדטה-גריד.כעת הגדרתי את SelectedValuePath ל ID שבטיפוס השורה של המשולבת, וזה נשמר במאפיין PersonID שבטיפוס של השורה של הדטה-גריד על ידי ש SelectedValueBinding מוגדר ל PersonID.
אבל כעת ראיתי שכאשר לוחצים על ראש השורה הערכים מתמיינים לפי סדר עולה או יורד של ה ID אע''פ שלמעשה בתא מוצג שם האיש קשר, איך אפשר לעשות שהמיון יהיה ע''פ המוצג בתא ולא על פי SelectedValuePath ?
ניסיתי גם להגדיר את ה SortMemberPath של העמודה עם המשולבות לאותו המאפיין ששמתי ב DisplayMemberPath של העמודה, אבל אז המיון בכלל לא עבד.מה עושים?
תודה לכולם.פורסם במקור בפורום CODE613 ב19/12/2013 19:41 (+02:00)
-
אכן כן,
עשיתי כך :
DisplayMemberPath = "שם פרטי" מאובייקט "איש קשר"
SelectedValuePath = "מס' תז" מאובייקט "איש קשר"
SelectedValueBinding = "מזהה איש קשר" מאובייקט "הזמנה"ולגבי המיון:
SortMemberPath = SelectedValueBinding
ממיין את השמות לפי התעודת זהות ולא לי השם עצמו.
אם עושים:
SortMemberPath = SelectedValuePath
או:
SortMemberPath = DisplayMemberPath
אין מיון בכלל.פורסם במקור בפורום CODE613 ב19/12/2013 22:46 (+02:00)
-
אם אני מכניס ל בSortMemberPath את ''שם פרטי'' אז המיון לא עובד בכלל, הצורה היחידה שהוא עובד זה רק אם אני מגדיר את בSortMemberPath ל SelectedValueBinding, אלא שאז הוא ממיין את המזהים ולא מה שמוצג על המסך בתוך כל תא.
לגבי הבינדיג והמחרוזות בדקתי שוב והכל בסדר.פורסם במקור בפורום CODE613 ב22/12/2013 20:02 (+02:00)
-
הצורה היחידה שהוא עובד זה רק אם אני מגדיר את בSortMemberPath ל SelectedValueBinding, אלא שאז הוא ממיין את המזהים ולא מה שמוצג על המסך בתוך כל תא.
זה אמור לקרות גם אם לא הגדרת את SortMemberPath כלל.
אני לא מצליח לעזור לך. רק לפחות תידע איפה לחקור אז אני מכוון אותך מה אמורים לעשות.
למה אצלך לא עובד זה מה שנשאר לחקור אבל לכה"פ צמצמתי לך את החפירה.בדרך אגב, אף פעם אל תחסוך בהעלאת קוד (רלוונטי כמובן), כי גם אם הוא תקין, אתה מרויח שנחסך דיון עליו.
פורסם במקור בפורום CODE613 ב22/12/2013 20:54 (+02:00)