Question

La dernière fois que j'ai commencé à mettre en œuvre un modèle de vue de modèle pour travailler facilement avec WPF. Je dois dire que c'est élégant, mais il y a une chose que je dois remarquer. J'ai constaté un problème de performances lorsque je travaillais avec MVVM.

Emballage de l'objet d'origine dans un " Visionnable ". objet peut être coûteux en cas de nombreux articles. J'ai récemment eu un ListView avec environ 20 000 éléments. La création de la vue a pris plusieurs secondes. Est-ce que je fais quelque chose de mal ou c'est assez logique. Si oui, comment résoudre ce problème?

Mon exemple de code:

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
    }

et un objet 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;                
            }
        }
    }
Était-ce utile?

La solution

Dan Crevier dans la partie 6 de sa série sur MVVM (une des premières apparitions de MVVM, il l’appelle DM-V-VM ...) touchez ce sujet:

  

Si vous avez un grand nombre d’articles, vous   veux seulement garder les objets visibles   vivre. Nous ferons cela en donnant des modèles   Activer et désactiver les fonctions qui   contrôler quand il est en direct. (...)

     

Disons que nous avons des milliers de nos modèles dans un ListBox. C'est seulement   va montrer que quelques-uns d'entre eux sur   l'écran à la fois et nous voulons seulement   ceux sur l'écran pour être actif. Bien   utiliser le truc de la propriété ci-joint pour faire   ceci sans avoir à écrire la coutume   code chaque fois que nous voulons activer et   désactiver les modèles ...

Plus récemment, Bea Stollnitz a également apporté des solutions à ce problème ici . J'espère que cela pourra vous être utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top