Domanda

L'ultima volta che ho iniziato a implementare un Modello View ViewModel per lavorare facilmente con WPF. Devo dire che è elegante, ma c'è una cosa che devo sottolineare. Ho notato un problema di prestazioni quando ho lavorato con MVVM.

Avvolgimento dell'oggetto originale in un " Visualizzabile " l'oggetto può essere costoso in caso di molti articoli. Di recente ho avuto un ListView con circa 20.000 articoli. Ci sono voluti diversi secondi per creare la vista. Sto facendo qualcosa di sbagliato o è abbastanza logico. In tal caso, come risolvere questo problema?

Il mio codice di esempio:

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
    }

e un oggetto principale:

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;                
            }
        }
    }
È stato utile?

Soluzione

Dan Crevier nella parte 6 della sua serie su MVVM (una delle prime apparizioni di MVVM, la chiama DM-V-VM ...) tocca questo argomento:

  

Se hai un grande set di oggetti, tu   voglio solo mantenere gli oggetti visibili   vivere. Lo faremo dando modelli   Attiva e disattiva le funzioni che   controllare quando è in diretta. (...)

     

Supponiamo di avere migliaia di nostri modelli in un ListBox. È solo   mostrandone solo alcuni   lo schermo alla volta e vogliamo solo   quelli sullo schermo per essere attivi. Bene   usa il trucco della proprietà allegato per fare   questo senza dover scrivere personalizzato   codice ogni volta che vogliamo attivare e   disattivare i modelli ...

Più recentemente Bea Stollnitz offre anche una soluzione a questo problema qui . Spero che questo ti possa essere utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top