דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. טיפ: WPF - Binding Refresh By INotify Externaly

טיפ: WPF - Binding Refresh By INotify Externaly

מתוזמן נעוץ נעול הועבר ארכיון code613m
2 פוסטים 2 כותבים 223 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #1

    זהו טיפ שיעניין מי שמתעסק עם 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)

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    2
    • א מנותק
      א מנותק
      ארכיטקט
      כתב ב נערך לאחרונה על ידי
      #2

      תענוג בעיניים!
      בונבוניירה של קוד.
      החלום שלי תמיד היה שזה יהיה "כמו אקסל" שיודע לבד מי מזין את מה ומה מזיז את מי. אבל זה כנראה לא יקרה אף פעם. אגב מעניין אותי באנגולר איך הוא מתנהג במצבים כאלו האם הוא יודע להיות כמו אקסל.

      פורסם במקור בפורום CODE613 ב22/02/2015 19:11 (+02:00)

      אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

      תגובה 1 תגובה אחרונה
      0

      בא תתחבר לדף היומי!
      • התחברות

      • אין לך חשבון עדיין? הרשמה

      • התחברו או הירשמו כדי לחפש.
      • פוסט ראשון
        פוסט אחרון
      0
      • דף הבית
      • קטגוריות
      • פוסטים אחרונים
      • משתמשים
      • חיפוש
      • חוקי הפורום