Problema di prestazioni Model-View-ViewModel
-
05-07-2019 - |
Domanda
L'ultima volta che ho iniziato a implementare un Modello View ViewModel per lavorare facilmente con WPF. Devo dire che è elegante, ma c'è una cosa che devo sottolineare. Ho notato un problema di prestazioni quando ho lavorato con MVVM.
Avvolgimento dell'oggetto originale in un " Visualizzabile " l'oggetto può essere costoso in caso di molti articoli. Di recente ho avuto un ListView con circa 20.000 articoli. Ci sono voluti diversi secondi per creare la vista. Sto facendo qualcosa di sbagliato o è abbastanza logico. In tal caso, come risolvere questo problema?
Il mio codice di esempio:
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 un oggetto principale:
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;
}
}
}
Soluzione
Dan Crevier nella parte 6 della sua serie su MVVM (una delle prime apparizioni di MVVM, la chiama DM-V-VM ...) tocca questo argomento:
Se hai un grande set di oggetti, tu voglio solo mantenere gli oggetti visibili vivere. Lo faremo dando modelli Attiva e disattiva le funzioni che controllare quando è in diretta. (...)
Supponiamo di avere migliaia di nostri modelli in un ListBox. È solo mostrandone solo alcuni lo schermo alla volta e vogliamo solo quelli sullo schermo per essere attivi. Bene usa il trucco della proprietà allegato per fare questo senza dover scrivere personalizzato codice ogni volta che vogliamo attivare e disattivare i modelli ...
Più recentemente Bea Stollnitz offre anche una soluzione a questo problema qui . Spero che questo ti possa essere utile.