Problema de rendimiento Model-View-ViewModel
-
05-07-2019 - |
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;
}
}
}
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.