Pregunta

La última vez que comencé a implementar un Model View ViewModel para trabajar fácilmente con WPF. Tengo que decir que es elegante, pero hay una cosa que debo comentar. Noté un problema de rendimiento al trabajar con MVVM.

Envolviendo el objeto original en un " visible " El objeto puede ser costoso en el caso de muchos artículos. Recientemente tuve un ListView con aproximadamente 20 000 artículos. Tomó varios segundos crear la Vista. ¿Estoy haciendo algo mal o es bastante lógico? Si es así, ¿cómo resolver este problema?

Mi código de ejemplo:

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
    }

y un objeto principal:

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;                
            }
        }
    }
¿Fue útil?

Solución

Dan Crevier en parte 6 de su serie sobre MVVM (una de las primeras apariciones de MVVM, lo llama DM-V-VM ...) toca este tema:

  

Si tiene un gran conjunto de elementos, usted   solo quiero mantener los elementos visibles   vivir. Haremos esto dando modelos   Activar y desactivar funciones que   controlar cuando es en vivo. (...)

     

Digamos que tenemos miles de nuestros modelos en un ListBox. Es solamente   vamos a mostrar solo algunos de ellos en   la pantalla a la vez y solo queremos   los que están en pantalla para estar activos. Bien   use el truco de propiedad adjunto para hacer   esto sin tener que escribir personalizado   codificar cada vez que queremos activar y   desactivar modelos ...

Más recientemente, Bea Stollnitz también ofrece soluciones a este problema aquí . Espero que esto te sea útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top