-
יש כמה מושגים שלא הבנתי בWPF אם מישהו יכול לעזור לי
, NotifyOnValidationError, ValidatesOnDataErrors=ValidatesOnExceptions,SelectionChanged ,SelectedValuePath,ItemsSourceDisplayMemberPath -
אני בונה תוכנית בסיסית בWPF שנה שנייה בלימודים ויש לי ידע בסיסי בפקדים ובתכנות בC# , אני צריכה לעשות בחלון שעד שאני לא בוחרת מהקומבו בוקס איזה משהו אני לא יכולה לגשת לשום פקד אחר ואני צריכה להשתמש במושגים האלה ולא כל כך הבנתי עד הסוף את המשמעות שלהם
<ComboBox x:Name="UpdateMotherID" HorizontalAlignment="Left" Height="23" Margin="0,4.167,0,6.833"
SelectedValue="{Binding ID_Mother, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=true}"
SelectionChanged="UpdateMotherID_SelectionChanged"
VerticalAlignment="Center" Width="120"/>this.UpdateMotherID.ItemsSource = bl.GetAllMothers();
this.UpdateMotherID.DisplayMemberPath = "ID_Mother";
this.UpdateMotherID.SelectedValuePath = "ID_Mother"; -
הבנתי, את יותר מונחית מטרה מאשר מונחית הבנה, אבל זו גם דרך לפעמים.
בא נדבר על הקומבובוקס. זה פקד שיש בו א. רשימת פריטים, ב. אפשרות לבחור פריט
האיגוד (Binding) שלו מסובך יותר:
נניח ישנה רשימת פריטים מסוג Person שזה class עם המון מאפיינים.
וישנו מאפיין במקום כל שהוא, נקרא לו לשם הדוגמא TheMasterPersonId, שמקבל את התעודת זהות של Person נבחר יחיד.
בUI יש לנו כמה משימות של Binding:
א. איגוד פקד הרשימה לרשימת הPerson (בינדינג לItemsSource).
ב. קביעה איזה מאפיין מתוך המחלקה Person ייבחר כדי להציג את המחלקה (בד"כ נבחר למשל שם משפחה למשל, זה נעשה השמת שם המאפיין לDisplayMemberPath, ללא בינדינג).
ג. איגוד בין הTheMasterPersonId לבין הפריט הנבחר ברשימה (בינדינג בין הSelectedValue לבין TheMasterPersonId).
ד. בשביל האיגוד האחרון, צריך לקבוע גם איזה מאפיין מתוך הפריט הנבחר, יש להציב בTheMasterPersonId שהרי אי אפשר להציב בו Person שזו כל המחלקה אלא רק Int שזה מאפיין מתוך המחלקה (זה נעשה ע"י הצבת שם המאפיין הרצוי כסטרינג לתוך SelectedValuePath, ללא בינדינג).שימי לב שגם SelectedValuePath וגם DisplayMemberPath מקבלים ערך סטרינג ולא איגוד כל שהוא. והם לא בהכרח נדרשים - בהעידר DisplayMemberPath מבוצעת למחלקה ToString שהרבה פעמים מספיק, ובהעידר SelectedValuePath אפשר לאגוד לSelectedItem שמאגד את כלל האובייקט - כמובן שצריך שמאפיין היעד יהיה מסוג זהה ולא int למשל.
-
בקשר לולידציה:
המאפיינים ValidateXX וגם NotifyXX מיועדים לקבוע האם ומתי יבוצע בדיקת תקיפות לנתונים שהוזנו ע"י המשתמש, ואיזה חיווי הוא יקבל על כך.
אם את חייבת להשתמש בדרך זו, אז תחפשי באינטרנט WPF Validation אבל אם כל מטרתך זה מניעת לחיצת אישור טכנית ללא בחירת איבר מהרשימה, זה ניתן להיעשות באופן גס ע"י סטייל עם טריגר על ריקנותו של המאפיין שאסור שיהיה ריק, והסגנון שמוחל הוא IsEnable=False. ככה אני אישית תמיד עושה, ולכן אני לא מכיר טוב איך עושים לפי הספר... -