Проблема производительности Model-View-ViewModel
-
05-07-2019 - |
Вопрос
В прошлый раз я начал реализовывать модель представления модели , чтобы легко работать с WPF. Я должен сказать, что это элегантно, но есть одна вещь, которую я должен отметить. Я заметил проблему с производительностью при работе с MVVM.
Оборачивание исходного объекта в " видимый " Объект может быть дорогим в случае многих предметов. Недавно у меня был ListView с около 20 000 элементов. Создание представления заняло несколько секунд. Я делаю что-то не так или это вполне логично. Если да, то как решить эту проблему?
Мой пример кода:
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
}
и главный объект:
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;
}
}
}
Решение
Дэн Кревье в 6-й части своей серии статей о MVVM (одно из первых появлений MVVM, он называет это DM-V-VM ...), коснитесь этой темы:
Если у вас большой набор предметов, вы только хочу сохранить видимые предметы жить. Мы сделаем это, дав модели Активировать и деактивировать функции, которые контролировать, когда он живой. (...)
Допустим, у нас есть тысячи наших моделей в ListBox. Это только собираюсь показать только некоторые из них на экран за один раз, и мы хотим только те, что на экране, чтобы быть активными. Что ж использовать трюк с прикрепленным свойством, чтобы сделать это без необходимости писать обычай код каждый раз, когда мы хотим активировать и деактивировать модели ...
В последнее время Беа Штольниц также предлагает решение этой проблемы здесь . Я надеюсь, что это может быть полезно для вас.