سؤال

آخر مرة بدأت في تنفيذ نموذج عرض ViewModel للعمل بسهولة مع برنامج الأغذية العالمي.يجب أن أقول أنه أنيقة, ولكن هناك شيء واحد يجب أن الملاحظة.لاحظت مشكلة الأداء عند العمل مع MVVM.

التغليف الأصلي الكائن في "للعرض"كائن يمكن أن تكون مكلفة في حالة العديد من البنود.كنت مؤخرا قد ListView مع حوالي 20 000 البنود.استغرق الأمر عدة ثوان إلى خلق رأي.أنا doint أي شيء خاطئ أو أنها منطقية تماما.إذا كان الأمر كذلك, كيفية حل هذه المشكلة ؟

بلدي رمز المثال:

public class AdresseVm : INotifyPropertyChanged
    {        
        public AdresseVm(Adresse adresse)
        {
            this.adresse = adresse;
        }

        private bool isChecked;
        public bool IsChecked
        {
            get { return isChecked; }
            set
            {
                isChecked = value;
                OnPropertyChanged("IsChecked");
            }
        }

        private Adresse adresse;
        public Adresse Adresse
        {
            get { return adresse; }
            set
            {
                adresse = value;
                OnPropertyChanged("Adresse");
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }

و الهدف الرئيسي:

public class AdressenVm
    {
        private IEnumerable<Adresse> adressen;
        private ObservableCollection<AdresseVm> adressenListVm = new ObservableCollection<AdresseVm>();

        public AdressenVm(IEnumerable<Adresse> adressen)
        {
            this.adressen = adressen;

            foreach (Adresse adresse in adressen)
                adressenListVm.Add(new AdresseVm(adresse));
        }

        public ObservableCollection<AdresseVm> AdressenListVm
        {
            get { return adressenListVm; }
            set { adressenListVm = value; }
        }

        public IEnumerable<Adresse> CheckedAdresses
        {
            get
            {
                foreach (AdresseVm a in adressenListVm)                
                    if (a.IsChecked) yield return a.Adresse;                
            }
        }
    }
هل كانت مفيدة؟

المحلول

دان Crevier في الجزء 6 من سلسلة حول MVVM (واحد من أول مباراة من MVVM يسميه DM-الخامس-VM...) لمس هذا الموضوع:

إذا كان لديك مجموعة كبيرة من العناصر ، فقط تريد أن تبقي العناصر المرئية تعيش.ونحن سوف نفعل ذلك من خلال تقديم نماذج تفعيل وتنشيط وظائف السيطرة عندما يكون العيش.(...)

دعونا نقول لدينا الآلاف من النماذج في مربع القائمة.فقط سوف تظهر فقط عدد قليل منهم على الشاشة في وقت نحن نريد فقط منها على أن تكون الشاشة نشطة.سوف استخدام تعلق الملكية أن تفعل خدعة هذا دون الحاجة إلى كتابة مخصص رمز في كل مرة نريد تفعيل إلغاء النماذج...

ومؤخرا بي Stollnitz أيضا إعطاء حلول لهذه المشكلة هنا.آمل أن يكون هذا يمكن مفيدا لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top