WPF - תופעה מוזרה בדטה גריד
-
הגדרתי RowDetailsTemplate לדטה גריד שלי, כדי שיציג כמה פרטים נוספים על הרשומה הנבחרת
ורציתי לבדוק מתי הדטה גריד יוצר את הפקד שאמור להופיע בתוך ה RowDetails ובשביל זה נרשמתי לארוע Loaded של אחד מהפקדים שבתוך RowDetailsTemplate
והנה אני רואה שהארוע של הטעינה נורה שוב ושוב בלי שאני בוחר שורה כל שהיא אלא סתם גולל את הדטה גריד עם העכבר מלמעלה למטה ובחזרה, יש לציין שהוא מתחיל את ההתנהגות הזו לאחר שבחרתי שורה ואחר כך שורה אחרת ומאז בעת הגלילה נורה שוב ושוב הארוע של הטעינה עבור השורות שנראות בתצוגה בעת הגלילה.וכיון ש RowDetails שלי מכיל פקד שהמאפיין שלו דרוש משאב רשת הגלילה הופכת לאיטית מאוד כי כל הזמן הוא ניגש לרשת כדי לקבל את הנתונים וכל זה ללא צורך!
יש מצב לממש בעצמי את RowDetails ? רעיונות לפתרון?
פורסם במקור בפורום CODE613 ב23/11/2016 20:29 (+02:00)
-
התברר שהבעיה היא לא ב RowDetails אלא בבינדינג עצמו, שהבינדינג בנוי כך שכאשר משתנה הדטה-קונטקסט של הפקד הוא מעדכן את הכל היעדים על פי המקור, ואע"פ שפקד היעד כלל לא נראה בתצוגה.
יש רעיונות איך להתגבר על זה?
פורסם במקור בפורום CODE613 ב24/11/2016 09:16 (+02:00)
-
אין בזה הרבה מסתורין. זה שליוב של שתי התנהגויות Collapsed + Virtual Mode.
הפקד שנמצא בדטה גריד עבור הRowDetailsTemplate מוגדר על Collapsed שזה אומר שזה מרונדר מייד כאילו זה מוצג בשונה מHidden.
בנוסף הדטה גד לא מייצר בכלל שורות שלא נראות מה שמביא את האפקט של יצירה תוך כדי גלילה. אם תבטל את הוירטואל מוד הכל ייווצר ברגע עליית הדטה גריד.
אינני יודע אם קל לשנות את המימוש של RowDetiiled אבל קל מאוד ליצור משהו מקביל (בין שרה לשורה) שיעבור עם hiden ובעת לחיצה Visible, אבל כנראה שזה יהיה פחות נעים למשתמש - הוא יחוש קיפאון לשניה.
אני חושב שהפקד שם לא אמור להיות כבד - זה לא לעניין פקד בעל משאבים פר שורה. במקרה זה הייתי עושה חלונית בצד שהקונטקסט שלה מאוגד לשורה הנוכחית בגריד.פורסם במקור בפורום CODE613 ב24/11/2016 10:39 (+02:00)
-
זו בעיה בבינדינג, המפתחים שלו דאגו לתת אפשרות להגדיר מתי המקור יתעדכן בחזרה מהיעד אבל לא נתנו אפשרות לבחור מתי היעד יתעדכן מהמקור, ולכן המצב כעת שגם כאשר הפקד כלל לא נראה והדטה-קונטקסט שלו משתנה הבינדינג מיד מעדכן את היעד על פי המקור החדש. וזה ממש מיותר, חייבים רעיון איך למנוע את זה.
פורסם במקור בפורום CODE613 ב24/11/2016 12:14 (+02:00)
-
מצאתי פתרון פשוט וקל:
Private Sub DataGrid_RowDetailsVisibilityChanged(sender As Object, e As System.Windows.Controls.DataGridRowDetailsEventArgs) If e.Row.IsSelected Then e.DetailsElement.DataContext = e.Row.DataContext Else e.DetailsElement.DataContext = Nothing End If End Sub
פורסם במקור בפורום CODE613 ב24/11/2016 12:34 (+02:00)