טיפ: WPF - Binding Refresh By INotify Externaly
-
זהו טיפ שיעניין מי שמתעסק עם WPF בצורה הפחות נאה, כלומר לא לפי ספר הזהב של ארכיטקטורה זו.
[u:23o4st2z]הקדמה:[/u:23o4st2z]
כידוע הBinding של WPF עשויים להתעדכן בברירת מחדל ע"י הממשק INotifyPropertyChanged.
כלומר המחלקה שאליה הBinding מאזין, אם היא מממשת את הממשק הנ"ל + מפעילה בעת עדכון (בדרך כלל, בSet של הProperty), הBinding ישנה באלגנטיות וביעילות את תוכנו של מאפיין היעד.אבל...
א. מאוד מעצבן לכתוב בכל SET את הפעלת האירוע של PropertyChanged. זה ממש לכלוך בעיניים בצד הלוגיקה, שקשורה לצד התצוגה. נכון, לפי מודל הMVVM צריך ליצור מחלקה עוטפת למחלקת הלוגיקה שממנה התצוגה תשאב, והיא זו שצריכה לטפל בGet וSet של כל מאפיין, אבל זה כאב ראש עוד יותר גדול.
ב. הרבה פעמים המתכנת מתכנן מראש את עת העדכון של מאפיין, כך שזה מגוחך שהוא צריך ליצור אירוע גלובלי. נניח יש חלון שכתוב שם פרטים, ויש אפשרות עדכון. אחרי העדכון הפרטים צריכים להתאים לערכים החדשים. זה מקרה בו המתכנת יודע בזמן הכתיבה בדיוק מתי דרוש לעדן, ומצידו לוותר על שכלול המעקב אחרי שינויים במאפיין ופשוט לבצע ריפרוש ידני בסגנון Binding.Update. או גרוע יותר: TextBox1.Text = NewValue.אחרי המחלקה שאציג, הקוד יראה ככה:
someObject.SomeProperty = 150; //כאן דרוש עדכון... בתצוגה someObject.ExePropChange(); //או someObject.ExePropChange(new string[] { "SomeProperty" });
[u:23o4st2z]תמצית:[/u:23o4st2z]
המחלקה בקוד להלן, היא מחלקת הבסיס של כל המחלקות שיש לי בפרוייקט. מכל מקום בו אני יודע שדרוש עדכון, אני קורא חיצונית למחלקה בה השינוי התבצע, ו"מבקש" ממנה להפעיל את PropertyChanged. למתודה שני גירסאות - אחת מפעילה את כל המאפיינים, והשניה מקבלת רשימה.[u:23o4st2z]קוד:[/u:23o4st2z]
public abstract class EnableExtNotify : INotifyPropertyChanged { public static Dictionary<Type, string[]> dic = new Dictionary<Type, string[]>(); public EnableExtNotify() { var t = GetType(); if (!dic.ContainsKey(t)) dic[t] = t.GetProperties().Select(x => x.Name).ToArray(); } public void ExePropChange() { ExePropChange(dic[GetType()]); } public void ExePropChange(string[] arr) { if (PropertyChanged != null) foreach (var item in arr) PropertyChanged(this, new PropertyChangedEventArgs(item)); } public event PropertyChangedEventHandler PropertyChanged; }
פורסם במקור בפורום CODE613 ב22/02/2015 18:41 (+02:00)
-
תענוג בעיניים!
בונבוניירה של קוד.
החלום שלי תמיד היה שזה יהיה "כמו אקסל" שיודע לבד מי מזין את מה ומה מזיז את מי. אבל זה כנראה לא יקרה אף פעם. אגב מעניין אותי באנגולר איך הוא מתנהג במצבים כאלו האם הוא יודע להיות כמו אקסל.פורסם במקור בפורום CODE613 ב22/02/2015 19:11 (+02:00)