Frage

Zuletzt begann ich ein Model-View-Viewmodel implementieren leicht mit WPF zu arbeiten. Ich muss sagen, dass es ist elegant, aber es gibt eine Sache, die ich zu bemerken haben. Ich bemerkte ein Leistungsproblem , wenn sie mit MVVM arbeiten.

Verpackung das ursprüngliche Objekt in ein „ Sichtbarer “ Objekt kann bei vielen Einzelteilen teuer sein. Vor kurzem hatte ich ein Listview mit etwa 20 000 Stück. Es dauerte einige Sekunden, um die Ansicht zu erstellen. Bin ich etwas falsch oder es ist ganz logisch doint. Wenn ja, wie dieses Problem zu lösen?

Mein Beispielcode:

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
    }

und eine Hauptaufgabe:

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;                
            }
        }
    }
War es hilfreich?

Lösung

Dan Crevier in Teil 6 seiner Serie über MVVM (einer der ersten Auftritte von MVVM, nennt er die DM-V-VM ...) dieses Thema berühren:

  

Wenn Sie eine große Menge von Elementen, Sie   nur wollen die sichtbaren Elemente aufbewahrt werden sollen   Leben. Wir werden dies tun, indem Modelle geben   Aktivieren und Deaktivieren Sie Funktionen, die   Kontrolle, wenn es zu Hause ist. (...)

     

Lassen Sie uns sagen, dass wir Tausende unserer Modelle in einem ListBox haben. Es ist nur   geht zu zeigen, nur ein paar von ihnen auf   der Bildschirm zu einem Zeitpunkt, und wir nur wollen   die, die auf dem Bildschirm aktiv zu sein. Gut   Verwenden Sie den im Eigentum Trick zu tun   dies, ohne dass benutzerdefinierte schreiben   Code jedes Mal, wenn wir aktivieren wollen und   deaktivieren Modelle ...

In jüngerer Zeit Bea Stöllnitz geben auch eine Lösung für dieses Problem: hier . Ich hoffe, dies kann nützlich für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top