locked
בעיה בBinding RRS feed

  • שאלה

  • היי

    אני משתמשת בפקד 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.


    יום רביעי 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 שאת כן תופסת?


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    יום רביעי 15 אוגוסט 2012 07:59
  • אני כן מקבלת את הערך הנכון בתג, הבעיה שלי היא לא בבינדינג לISEXPANDED של האבא, שכן נכנס לתג כראוי

    אלא בהעברת ערך התג למאפיין ISDISPLAYED באמצעות בינדינג

    יום רביעי 15 אוגוסט 2012 08:13
  • את יכולה אז להעלות מספיק קוד על מנת שנשחזר את הבעיה?
    כמו כן יש לי הרגשה שאת ניגשת לזה לא נכון - מה את מנסה לעשות באמת (שבגללו את צריכה ליצור כזה בינדינג?)


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    יום רביעי 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
    מנחה דיון