מעשה מטופס
-
שבנוי ב WPF, ובו 3 קבוצות של כפתורי רדיו, הבחירה של המשתמש מכל קבוצה אמורה להשלח לשרת בסיום התהליך.
האתגר הוא לקלוט את הבחירה של המשתמש וליצור ממנה את המחרוזת הסופית.
כרגע זה כתוב כך:<RadioButton GroupName="0" Tag="one"/> <RadioButton GroupName="0" Tag="two"/> <RadioButton GroupName="1" Tag="one"/> <RadioButton GroupName="1" Tag="two"/> <RadioButton GroupName="2" Tag="one"/> <RadioButton GroupName="2" Tag="two"/>
ובקוד האחורי יש מערך בן 3 איברים, וכל בחירה של המשתמש קוראת לפונקציה שניגשת למערך לפי האינדקס של הגרופ ניים, ומכניסה לו את הערך של ה tag של הכפתור רדיו, משהו כזה:
string[] formData = new string[3]; private void setFormData(object sender, RoutedEventArgs e) { var radioButton = sender as RadioButton; formData[Int32.Parse(radioButton.GroupName)] = radioButton.Tag; }
זו דרך קצרה, אבל הכל אנונימי, אי אפשר לקרוא למשתנה בשם הגיוני, ולא להגדיר את הגרופ ניים עם שם הגיוני. צריך לזכור בעל פה מה כל אינדקס במערך מסמל.
מה הדרך הכי נקיה לעשות את זה?פורסם במקור בפורום CODE613 ב21/04/2017 03:23 (+03:00)
-
היה ברור לי שהכיוון הוא ListBox (=רשימת ערכים, עם אפשרות בחירה של אחד מהם) אבל לקח לי זמן למצוא איך כדאי.
בסוף יצא לי ככה, שתי סטיילים (לשים בריסורס של החלון או האפליקציה):
<Style TargetType="ListBoxItem" x:Key="asCheckBox"> <Style.Setters> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <CheckBox Margin="8,0" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}" Content="{TemplateBinding Content}" /> </ControlTemplate> </Setter.Value> </Setter> </Style.Setters> </Style> <Style TargetType="ListBox" x:Key="listChecks" > <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Setter.Value> </Setter> </Style>
וכעת הListBox ככה:
<ListBox x:Name="fruitsList" SelectedValuePath="Tag" Style="{StaticResource listChecks}"> <ListBoxItem Tag="a" Style="{StaticResource asCheckBox}">תפוז</ListBoxItem> <ListBoxItem Tag="b" Style="{StaticResource asCheckBox}">תפוח</ListBoxItem> <ListBoxItem Tag="c" Style="{StaticResource asCheckBox}">שתיהם</ListBoxItem> </ListBox>
ובקוד ככה:
var selected = fruitsList.SelectedValue?.ToString();
פורסם במקור בפורום CODE613 ב21/04/2017 04:22 (+03:00)
-
למה עשיתי רדיו ולא צ'קבוקס? סיבוך. כי ברדיו, לחיצה נוספת עליו לא מכבה אותו אלא לחיצה על "חבירו לתא". ומה זה חבירו? או שהם באותו קונטיינר, או שהם חולקים את אותו GroupName.
כעת הבעיה שעצמים של הליסט לא נמצאים ישירות באותו קונטיינר (הם עטופים בListBoxItem), ומאידך לפי שם זה ישתבש ברגע שיהי עוד ליסט אם הטמפלט הזה בחלון - לחיצה על כל פריט תכבה את הבחור בליסט השני...פורסם במקור בפורום CODE613 ב21/04/2017 04:26 (+03:00)
-
שבנוי ב WPF, ובו 3 קבוצות של כפתורי רדיו, הבחירה של המשתמש מכל קבוצה אמורה להשלח לשרת בסיום התהליך.
האתגר הוא לקלוט את הבחירה של המשתמש וליצור ממנה את המחרוזת הסופית.
כרגע זה כתוב כך:<RadioButton GroupName="0" Tag="one"/> <RadioButton GroupName="0" Tag="two"/> <RadioButton GroupName="1" Tag="one"/> <RadioButton GroupName="1" Tag="two"/> <RadioButton GroupName="2" Tag="one"/> <RadioButton GroupName="2" Tag="two"/>
ובקוד האחורי יש מערך בן 3 איברים, וכל בחירה של המשתמש קוראת לפונקציה שניגשת למערך לפי האינדקס של הגרופ ניים, ומכניסה לו את הערך של ה tag של הכפתור רדיו, משהו כזה:
string[] formData = new string[3]; private void setFormData(object sender, RoutedEventArgs e) { var radioButton = sender as RadioButton; formData[Int32.Parse(radioButton.GroupName)] = radioButton.Tag; }
זו דרך קצרה, אבל הכל אנונימי, אי אפשר לקרוא למשתנה בשם הגיוני, ולא להגדיר את הגרופ ניים עם שם הגיוני. צריך לזכור בעל פה מה כל אינדקס במערך מסמל.
מה הדרך הכי נקיה לעשות את זה?במקום מערך שים מאחורה מופע של מחלקה עם 3 מאפיינים בוליאניים עם שם הגיוני, ותעשה בינדינג בין רדיו אחד בכל קבוצה לבין מאפיין אחד במחלקה הנ"ל. בסוף כשתרצה שהכל יעלה לשרת פשוט תשתמש בסריאליאזר מוכן שיהפוך לך כל מחלקה לJSON בשורה אחת. ראה כאן
http://www.newtonsoft.com/jsonפורסם במקור בפורום CODE613 ב21/04/2017 12:51 (+03:00)
-
במקום מערך שים מאחורה מופע של מחלקה עם 3 מאפיינים בוליאניים עם שם הגיוני, ותעשה בינדינג בין רדיו אחד בכל קבוצה לבין מאפיין אחד במחלקה הנ"ל.
הרי הסריאליזר יוציא OptionA=true;OptionB=false;OptionC=false, ולא ידוע לי מהשאלה אם צד השרת יכול להתמודד עם זה. במילים אחרות השאלה תישאר במקרה שאתה צריך דוקא להוציא טקסט בהתאם לבחירה.
משהו בסגנוןif(myXyz.OptionA) return "OptionA"; if(myXyz.OptionB) return "OptionB";
זה מסורבל קצת.
במידה וכתובים קוד מאחורה הייתי עושה מאפיין מסוג Enum ובינדינג עם קונוורטר לכל רדיו. אבל גם בכתיבת קוד הכי ראוי בעיני זה List שהSelectionItem שלו מאוגד למאפיין טקסט או Enum.פורסם במקור בפורום CODE613 ב21/04/2017 14:23 (+03:00)