Model-View-Viewmodel Performance-Problem
-
05-07-2019 - |
Frage
Zuletzt begann ich ein Model-View-Viewmodel implementieren leicht mit WPF zu arbeiten. Ich muss sagen, dass es ist elegant, aber es gibt eine Sache, die ich zu bemerken haben. Ich bemerkte ein Leistungsproblem , wenn sie mit MVVM arbeiten.
Verpackung das ursprüngliche Objekt in ein „ Sichtbarer “ Objekt kann bei vielen Einzelteilen teuer sein. Vor kurzem hatte ich ein Listview mit etwa 20 000 Stück. Es dauerte einige Sekunden, um die Ansicht zu erstellen. Bin ich etwas falsch oder es ist ganz logisch doint. Wenn ja, wie dieses Problem zu lösen?
Mein Beispielcode:
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
}
und eine Hauptaufgabe:
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;
}
}
}
Lösung
Dan Crevier in Teil 6 seiner Serie über MVVM (einer der ersten Auftritte von MVVM, nennt er die DM-V-VM ...) dieses Thema berühren:
Wenn Sie eine große Menge von Elementen, Sie nur wollen die sichtbaren Elemente aufbewahrt werden sollen Leben. Wir werden dies tun, indem Modelle geben Aktivieren und Deaktivieren Sie Funktionen, die Kontrolle, wenn es zu Hause ist. (...)
Lassen Sie uns sagen, dass wir Tausende unserer Modelle in einem ListBox haben. Es ist nur geht zu zeigen, nur ein paar von ihnen auf der Bildschirm zu einem Zeitpunkt, und wir nur wollen die, die auf dem Bildschirm aktiv zu sein. Gut Verwenden Sie den im Eigentum Trick zu tun dies, ohne dass benutzerdefinierte schreiben Code jedes Mal, wenn wir aktivieren wollen und deaktivieren Modelle ...
In jüngerer Zeit Bea Stöllnitz geben auch eine Lösung für dieses Problem: hier . Ich hoffe, dies kann nützlich für Sie.