משיב מוביל
בעיה בBinding

שאלה
-
היי
אני משתמשת בפקד TreeView. הפקד מציג רשימה הרארכית של ישויות, כאשר לכל ישות יש מאפיין IsDisplayed המציין האם ישות האבא מורחת
להלן הקוד:
<Style TargetType="{x:Type TreeViewItem}"> <Setter Property="Tag" Value="{Binding IsDisplayed,Mode=OneWayToSource}"/> <Style.Triggers> <DataTrigger Binding="{Binding IsExpanded,RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="True"> <Setter Property="Tag" Value="True"/> </DataTrigger> <DataTrigger Binding="{Binding IsExpanded,RelativeSource={RelativeSource AncestorType=TreeViewItem}}" Value="False"> <Setter Property="Tag" Value="False"/> </DataTrigger> </Style.Triggers> </Style>
מה שאני בעצם מנסה להשיג זה ליצור חיבור בין המאפיין IsDispplayed בישות לבין המאפיין IsExpanded באוביקט הויזואלי.
כפי הנראה הbinding נשבר ע"י הטריגר.
תודה רבה
יום שלישי 14 אוגוסט 2012 22:10
תשובות
-
תנסי את זה: http://sdrv.ms/NjI5z3
אני מקווה שזה מה שאת מנסה לעשות. אם לא אשמח לתיאור יותר מעמיק ;)
תומר
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- נערך על-ידי תומר שמםModerator יום רביעי 15 אוגוסט 2012 09:28 עדכון קישור
- הוצע כתשובה על-ידי תומר שמםModerator יום רביעי 15 אוגוסט 2012 09:51
- סומן כתשובה על-ידי _מפתחת יום רביעי 15 אוגוסט 2012 10:29
יום רביעי 15 אוגוסט 2012 09:27מנחה דיון
כל התגובות
-
אני לא בטוח שהבנתי לגמרי את המצב שאליו את חותרת, ואם תוכלי להביא את שאר ה-XAML של ה-TreeView אולי זה יעזור, אבל אם הבנתי נכון, את מנסה לקשר בין המאפיין IsDisplayed של ה-ViewModel לבין מאפיין ה-IsExpanded של ה-TreeViewItem, נכון? יש סיבה ש-Binding ישיר בין השניים לא יעבוד?
יום רביעי 15 אוגוסט 2012 04:39 -
אני מנסה לקשר בין המאפיין IsDisplayed של ה-ViewModel לבין מאפיין ה-IsExpanded של האבא שלו. ,
יום רביעי 15 אוגוסט 2012 07:21 -
הי,
נראה שקצת הסתבכת עם ההגדרה של ה- Style. במקרה זה כל מה שצריך לכתוב זה:
<Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsDisplayed}" /> </Style>
אבל...
TreeView הינו פקד ידוע לשמצה, יש איתו לא מעט בעיות. במקרה זה, אם כל הענפים מקופלים בהתחלה, ואת מעוניינת לפתוח ענף בן, אזי למרות שהפתרון שהצגתי לכאורה נכון, לא יפתח ענף הבן מהסיבה הפשוטה:
TreeView תומך ב- Virtualization בצורה היררכית, ועל כן, לא מייצר מראש את כל הילדים הויזואלים, אלא אם כן הרחבת אותם וגללת אליהם. במקרה של עץ גדול, את ממש לא תרצי לבטל את הווירטואליזציה.
תעשי ניסוי, תרחיבי את פקד ה- Root, ואת אחד מהבנים הראשונים בעזרת הפתרון שנתתי ו- IsDisplayed. תראי שיעבוד. תעשי אותו דבר אבל הפעם Root לא פתוח. לא יעבוד! תפתחי את ה- Root, יעבוד.
כמובן שיש פתרון, אבל הוא כבר הופך להיות מסורבל.
אני ממליץ במקרה זה לעבוד עם 3rd-Party, שכבר יודע לעשות את כל הטריקים הללו.
למקרה שבחרת להישאר עם TreeView הנה קישור מצויין שיעזור:
http://bea.stollnitz.com/blog/?p=54
תומר,
http://blogs.microsoft.co.il/blogs/tomershamam
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- הוצע כתשובה על-ידי תומר שמםModerator יום רביעי 15 אוגוסט 2012 07:27
- נערך על-ידי תומר שמםModerator יום רביעי 15 אוגוסט 2012 07:34 הוספת קישור
יום רביעי 15 אוגוסט 2012 07:27מנחה דיון -
לקשר את המאפיין IsDisplayed למאפיין IsExpanded באוביקט עצמו זה דבר טרביאלי :)
מה שאני מחפשת לעשות זה לקשר את IsDisplayed למאפיין IsExpanded של הפקד TreeViewItem באוביקט האבא
כלומר כשאבא מורחב\מתכווץ , אוביקט הבן יקבל את המידע בערך IsDisplayed. הדטה טריגר פועל כראוי- הTAG מכיל ערך True/False לפי המאפיין באבא שלו
מה שאני מחפשת זה להעביר את המידע ששמור בTAG למאפיין IsDisplayed במודל.יום רביעי 15 אוגוסט 2012 07:35 -
נראה לי שאת פשוט לא תופסת את ה TreeViewItem הנכון -
<DataTrigger Binding="{Binding IsExpanded,RelativeSource={RelativeSource AncestorType=TreeViewItem, Mode=FindAncestor,AncestorLevel=2}}" Value="True">
מה ששיניתי הוא לקבוע את Mode ל FindAncestor (אני לא חושב שזה הדיפולט, אבל אני לא בטוח), בנוסף צריך לודא שאת תופסת את הנכון במעלה ההירככיה, ואצלך נראה לי שזה רמה 2.
במידה ואני טועה - את יודעת איפה את נופלת? מה ה Source שאת כן תופסת?
יום רביעי 15 אוגוסט 2012 07:59 -
אני כן מקבלת את הערך הנכון בתג, הבעיה שלי היא לא בבינדינג לISEXPANDED של האבא, שכן נכנס לתג כראוי
אלא בהעברת ערך התג למאפיין ISDISPLAYED באמצעות בינדינג
יום רביעי 15 אוגוסט 2012 08:13 -
את יכולה אז להעלות מספיק קוד על מנת שנשחזר את הבעיה?
כמו כן יש לי הרגשה שאת ניגשת לזה לא נכון - מה את מנסה לעשות באמת (שבגללו את צריכה ליצור כזה בינדינג?)יום רביעי 15 אוגוסט 2012 08:18 -
אז למה לא אמרת קודם... ;)
בגדול, אני לא הייתי הולך על הכיוון שבחרת. את משתמשמת ב- DataTrigger כדי לאתחל property ב- Source, והמטרה של DataTrigger לבחון property ב-Source ובתמורה לעדכן property ב-Target.
למה לא לתכנן את מבנה הנתונים שלך כך שכל Item יהיה מקושר לאב? בצורה פשוטה זו תוכלי לעשות הכל כחלק מהלוגיקה של ה- ViewModel.
אפשרות אחרת, להשתמש ב- Attached Property. היה נחמד Attached Behavior אבל תהיה בעייה להגדיר אותו דרך Style!Please remember to mark the replies as answers if they help and unmark them if they provide no help.
יום רביעי 15 אוגוסט 2012 08:19מנחה דיון -
אכן הדרך נורמלית היא לקשר את המאפיין למודל של האבא
הבעיה אצלי זה שכל ישות יכולה להכיל הרבה ילדים כמובן, אך גם כל ישות יכולה להכיל הרבה אבות כך שאין לי דרך לדעת מי האבא הנוכחי אלא על ידי התחברות למאפיין ISEXPANDED דרך האוביקט הויזואלי
המטרה שלי היא להציג גריד במקביל לעץ, ברגע שנפתח צומת בעץ , כל הילדים שלה יופיעו בגריד ע"י BINDING בין המאפיין VISIBLITY לISDISPLAYED
יום רביעי 15 אוגוסט 2012 08:29 -
אז לא בדיוק ברור למה את צריכה IsDisplayed בבן?
למה לא לבצע Binding על ה- IsExpanded של האובייקט אבא שפתחת, ואז להציג את הבנים שלו.
במקרה שאת צריכה TreeGridView, אני ממליץ בחום על 3rdParty.
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
יום רביעי 15 אוגוסט 2012 08:43מנחה דיון -
תנסי את זה: http://sdrv.ms/NjI5z3
אני מקווה שזה מה שאת מנסה לעשות. אם לא אשמח לתיאור יותר מעמיק ;)
תומר
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- נערך על-ידי תומר שמםModerator יום רביעי 15 אוגוסט 2012 09:28 עדכון קישור
- הוצע כתשובה על-ידי תומר שמםModerator יום רביעי 15 אוגוסט 2012 09:51
- סומן כתשובה על-ידי _מפתחת יום רביעי 15 אוגוסט 2012 10:29
יום רביעי 15 אוגוסט 2012 09:27מנחה דיון -
הדוגמא שנמצאת פה: http://sdrv.ms/NjI5z3 היא בדיוק מה שאני מנסה לעשות רק שאני עשיתי זאת בצורה שהגריד מכיל את כל הרשימה בצורה שטוחה, ושורה מוצגת או לא ע"י BINDING לפרופרטי ISDISPLAYED
הבעיה היא שאצלי כל ישות מכילה ליסט של אבות, כלומר ישות יכולה להיות ילד של כמה אבות.
לכן אני לא יכולה להתיחס למשתנה ISEXPANDED של האבא, כי למשל A וB מצביעים את C כילד, כאשר A סגור וB מורחב , C אמור להיות מוצג בגריד בהקבלה לB.
וכאן אני מסתבכת באיך להעביר את המאפיין "האם אבא שלי מורחב" שהכנסתי ע"י טריגר לתג של TreeViewItem, והתג BINDING לפרופרטי ISDISPLAYED,
הפרופרטי מקבל פעם אחת את הערך של התג, וכנראה בהפעלת הטריגר הבינדינג נשבר והפרופרטי ISDISPLAYED לא מתעדכן
תודה רבה
יום רביעי 15 אוגוסט 2012 09:42 -
בדוגמה שכתבתי אני לא חושב שצריכה להיות בעיה. זה אמור לתמוך במצב כזה. תנסי.
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
יום רביעי 15 אוגוסט 2012 09:44מנחה דיון -
אין דרך לגרום למה שכתבתי לעבוד? כלומר בצורה שכל האוביקטים נצאים בגריד ורק הVISIBILITY שלהם משתנה?יום רביעי 15 אוגוסט 2012 09:47
-
ואגב, לקשר את המאפיין IsDisplayed למאפיין IsExpanded באוביקט עצמו זה ממש לא טרביאלי, טכנית כן, תוצאה לא!
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
יום רביעי 15 אוגוסט 2012 09:53מנחה דיון -
זה כבר הופך לשימוש לא נכון ב- WPF. הפתרון שהצעתי פשוט ונכון יותר. לכי עליו.
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
יום רביעי 15 אוגוסט 2012 10:28מנחה דיון -
אוקי
המון תודה לכולם!!
יום רביעי 15 אוגוסט 2012 10:29 -
בכיף, רק אל תשכחי לסמן כתשובה מה שרלוונטי.
תודה.
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
יום רביעי 15 אוגוסט 2012 10:32מנחה דיון