Pergunta

A última vez que começou a implementar um Model View ViewModel para trabalhar facilmente com WPF. Eu tenho que dizer, que é elegante, mas há uma coisa que eu tenho que observar. Notei uma problema de desempenho quando se trabalha com MVVM.

Envolver o objeto original em um " Visível " objeto pode ser caro no caso de muitos itens. Recentemente, tive um ListView com cerca de 20 000 itens. Demorou alguns segundos para criar a View. Sou doint nada de errado ou que é bastante lógico. Se assim for, como resolver este problema?

O meu exemplo de código:

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 um 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;                
            }
        }
    }
Foi útil?

Solução

Dan Crevier em parte 6 de sua série sobre MVVM (uma das primeiras aparições de MVVM, ele chama DM-V-VM ...) tocar neste tópico:

Se você tem um grande conjunto de itens, você só querem manter os itens visíveis viver. Nós vamos fazer isso dando modelos funções ativar e desativar que controlar quando é ao vivo. (...)

Vamos dizer que nós temos milhares de nossos modelos em um ListBox. É só vai mostrar apenas alguns deles em a tela em um tempo e nós só queremos os que estão na tela para ser ativo. Bem usar o truque propriedade anexada a fazer isso sem ter o costume de gravação código de cada vez que deseja ativar e modelos Desativar ...

Mais recentemente Bea Stollnitz também dar uma solução para este problema aqui . Espero que isto possa útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top