WPF: שימוש בCompositeCollection עם בינידינג מורכב
-
אני מנסה לכתוב קומבובוקס שיציג את רשימת התורמים הקיימים כבר (בחלון של הוספת תרומה חדשה)
ואני רוצה להוסיף ערך נוסף לרשימה, כדי שאם התורם לא קיים הוא יבחר בו ויפנה אותו לחלון של הוספת תורם חדש.
ראיתי כאן איך אפשר להוסיף אייטם נוסף מלבד הבינדינג.אולם הבעיה שלי היא שאני רוצה לעשות בינידנג לlist סטטי שהכרזתי עליו בחלון אחר, ולבחור מתוכו מאפיין מסוים.
מה שעשיתי זה הוספתי הפניה לחלון השני (local), ואח"כ עשיתי בינדינג לחלון הזה ובחרתי בpath את הlist המסויים שלי. אלא שאני לא מצליח למצוא איך אני מקשר את המאפיין המסוים. (שגם בתוכו אני רוצה שהוא יציג את שם התורם וישמור לי את הID. כבר הסברתם לי איך עושים זאת, אך בגלל שזה בתוך compositeCollection אז אני לא מצליח לעשות זאת.הנה הקוד:
<HeaderedContentControl Header="בחר תורם" > <ComboBox> <ComboBox.ItemsSource> <CompositeCollection> <ComboBoxItem>צור חדש...</ComboBoxItem> <CollectionContainer Collection="{Binding Source={StaticResource addToremWindow}path=Donors}"/> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox> </HeaderedContentControl>
תודה רבה!!
פורסם במקור בפורום CODE613 ב05/08/2015 13:17 (+03:00)
-
ניסיתי עכשיו.. כתבתי כך:
<ComboBox> <ComboBox.ItemsSource> <CompositeCollection> <ComboBoxItem>צור חדש...</ComboBoxItem> <CollectionContainer Collection="{Binding Source={x:Static local:AddTorem.donors}, Path=Id}"/> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox>
אבל עדיין זה לא פותר לי את השאלה, כי אני רוצה שמצד אחד יופיע לי אייטם נוסף ("צור חדש"), ומאידך תופיע רשימה המקושרת בבינדינג לID של התורם, אך תציג את שמו (וגם כאן אני רוצה יוצגו השם הפרטי ושם המשפחה יחד, שצריך בשביל זה להשתמש בitemtemplate). בשביל זה אני צריך displayMember וselectedValue" ואני לא מוצא איפה אני מגדיר אותם..
תודה רבה!פורסם במקור בפורום CODE613 ב12/08/2015 18:33 (+03:00)
-
@דוד ל.ט.
אכן בעיה. מה שאני חושב זה לעשות בריסורס (של הקומבו, למשל) DataTemplate ללא Key, ובמאפיין הType שלו לשים את הסוג של הdonors.
ניסיתי בכמה אפשרויות ולא הצלחתי..
כשאני כותב כך:<ComboBoxItem Selected="ComboBoxItem_Selected">צור חדש...</ComboBoxItem> <CollectionContainer Collection="{Binding Source={x:Static local:AddTorem.donors}}"/>
אז באמת הוא מציג לי בקומבו חוץ מ"צור חדש" גם עוד "person.donor" כמספר האובייקטים הקיימים.
אולם ברגע אני מוסיף לבידינג גם path=Id אז משום מה לא מוצג כלום.. עוד לפני שאני מנסה לעשות את הבינדינג המורכב.. ולכן זה קצת מעורר בי תהיות שאולי כבר כאן יש לי בעיה.
כמו כן, אם אני כותב path=FirstName אז הוא מציג לי את השם של המשתמש הראשון בלבד אך בצורה של רשימה, כלומר את "אברהם" הוא מציג "א" ובשורה מתחת "ב" וכן על זה הדרך. ואותו דבר בLastName.נמצא שכבר כאן יש בעיה שצריך לפתור עוד לפני הדטהטמפלט.
לגבי הדטה טמפלט:
כתבתי בתחילה כך:<ComboBox.Resources> <DataTemplate DataType="Id"> <TextBlock> <Run Text="{Binding FirstName}"/> <Run Text="{Binding LastName}"/> </TextBlock> </DataTemplate> </ComboBox.Resources>
וזה לא עבד..
שיניתי ל:
<DataTemplate DataType="{x:Static local:AddTorem.donors}">
ואז אני מקבל את הודעת השגיאה הנ"ל:
All objects added to an IDictionary must have a Key attribute or some other type of key associated with them.
ניסיתי גם כך (שזהו הנתיב המלא למאפיין ID)<DataTemplate DataType="{x:Static local:AddTorem.donors.Id}">
וקיבלתי את ההודעה הנ"ל:
מה לעשות :?: :?:
תודה רבה!פורסם במקור בפורום CODE613 ב16/08/2015 17:10 (+03:00)
-
הDataType אמור להיות אובייקט מסוג תורם. לא id. וגם לא מופע של תורם (Addtorem.donors זה מופע של רשימת תורמים).
אלא שניסיתי וזה לא עבד לי. אח"כ ניסיתי בItemTemplate (שחשבתי שזה לא טוב כי זה לא מתאים להוסף חדש) וזה עבד מצויין (כי רק הנוצרים דינאמית לוקחים את הטמפלט מItemTemplate).
הנה דוגמה קטנה:<ComboBox x:Name="cb" VerticalAlignment="Top" HorizontalAlignment="Right" Width="292" > <ComboBox.ItemTemplate> <DataTemplate DataType="Button"> <TextBlock Text="{Binding Width}" /> </DataTemplate> </ComboBox.ItemTemplate> <ComboBox.ItemsSource> <CompositeCollection> <ComboBoxItem>צור חדש...</ComboBoxItem> <CollectionContainer Collection="{Binding Mode=OneWay, Source={StaticResource coll}}" /> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox>
פורסם במקור בפורום CODE613 ב17/08/2015 16:17 (+03:00)
-
דוד תודה רבה על כל ניסיונות העזרה!!
קודם כל הייתי צריך להוסיף הפניה למחלקה של Person בהגדרות של החלון (xmlns: וכו') ואח"כ בdataType יכלתי לבחור את הסוג הנ"ל והוא הפסיק לומר לי שהוא לא מכיר אותו..
אבל עדיין אני לא מצליח לעשות זאת.. אם כי נראה לי שאני קצת מצליח לעלות על הכיוון לבעיה.
כשאני כותב כך:<ComboBox> <ComboBox.ItemTemplate> <DataTemplate DataType="{x:Type Person:Donor}"> <TextBlock> <Run Text="{Binding FirstName}"/> <Run Text="{Binding LastName}"/> </TextBlock> </DataTemplate> </ComboBox.ItemTemplate> <ComboBox.ItemsSource> <CompositeCollection> <ComboBoxItem Selected="ComboBoxItem_Selected">צור חדש...</ComboBoxItem> <CollectionContainer Collection="{Binding Source={x:Static local:AddTorem.donors}}"/> </CompositeCollection> </ComboBox.ItemsSource> </ComboBox>
אז הכל עובד מצויין!! ומלבד "צור חדש" אני מקבל את רשימת שמות שאר התורמים (שם פרטי+משפחה).
אולם, הבעיה שלי היא שאני רוצה שכאשר המשתמש יבחר באחד מהתורמים זה ישמור את הID שלו כדי שזה ישמר בנתונים של התרומה החדשה שהוא מזין. ולכן בבינדינג קונקשיין אני רוצה להוסיף path=Id. אלא שכאשר אני מוסיף את זה אז הוא לא מציג לי שום דבר מלבד הערך "צור חדש". וכן אם אני כותב path=FirstName וכדו' אז אני מקבל מלבד הערך של צור חדש עוד רשימה עם תאים ריקים (שזה כבר התקדמות :lol: ) בדומה למה שתיארתי למעלה.
נמצא שרק כאשר אני לא כותב לו path אז הוא עובד מצויין. אך מה זה שווה לי??
לכן, השאלה שלי היא היכן אני עושה את הבינדינג לID האם יש מקום אחר? או שלעשות את זה בקוד כאשר הוא לוחץ על הלחצן "שמור תרומה"?
תודה רבה!פורסם במקור בפורום CODE613 ב17/08/2015 18:13 (+03:00)