Model-View-ViewModel problema de desempenho
-
05-07-2019 - |
Pergunta
A última vez que começou a implementar um Model View ViewModel para trabalhar facilmente com WPF. Eu tenho que dizer, que é elegante, mas há uma coisa que eu tenho que observar. Notei uma problema de desempenho quando se trabalha com MVVM.
Envolver o objeto original em um " Visível " objeto pode ser caro no caso de muitos itens. Recentemente, tive um ListView com cerca de 20 000 itens. Demorou alguns segundos para criar a View. Sou doint nada de errado ou que é bastante lógico. Se assim for, como resolver este problema?
O meu exemplo de código:
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 um 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;
}
}
}
Solução
Dan Crevier em parte 6 de sua série sobre MVVM (uma das primeiras aparições de MVVM, ele chama DM-V-VM ...) tocar neste tópico:
Se você tem um grande conjunto de itens, você só querem manter os itens visíveis viver. Nós vamos fazer isso dando modelos funções ativar e desativar que controlar quando é ao vivo. (...)
Vamos dizer que nós temos milhares de nossos modelos em um ListBox. É só vai mostrar apenas alguns deles em a tela em um tempo e nós só queremos os que estão na tela para ser ativo. Bem usar o truque propriedade anexada a fazer isso sem ter o costume de gravação código de cada vez que deseja ativar e modelos Desativar ...
Mais recentemente Bea Stollnitz também dar uma solução para este problema aqui . Espero que isto possa útil.