Вопрос

В прошлый раз я начал реализовывать модель представления модели , чтобы легко работать с 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. Это только   собираюсь показать только некоторые из них на   экран за один раз, и мы хотим только   те, что на экране, чтобы быть активными. Что ж   использовать трюк с прикрепленным свойством, чтобы сделать   это без необходимости писать обычай   код каждый раз, когда мы хотим активировать и   деактивировать модели ...

В последнее время Беа Штольниц также предлагает решение этой проблемы здесь . Я надеюсь, что это может быть полезно для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top