Problème de performance Model-View-ViewModel
-
05-07-2019 - |
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;
}
}
}
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.