Проблема производительности Model-View-ViewModel - PullRequest
0 голосов
/ 29 июля 2009

В прошлый раз я начал реализовывать Model View ViewModel для удобной работы с WPF. Я должен сказать, что это элегантно, но есть одна вещь, которую я должен отметить. Я заметил проблему производительности при работе с MVVM.

Оборачивание исходного объекта в объект " Viewable " может быть дорогостоящим во многих случаях. Недавно у меня был 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;                
            }
        }
    }

1 Ответ

3 голосов
/ 29 июля 2009

Дэн Кревье в части 6 своей серии о MVVM (одно из первых появлений MVVM, он называет это DM-V-VM ...) затрагивает эту тему:

Если у вас большой набор предметов, вы только хочу сохранить видимые предметы жить. Мы сделаем это, дав модели Активировать и деактивировать функции, которые контролировать, когда он живой. (...)

Допустим, у нас есть тысячи наших моделей в ListBox. Это только собираюсь показать только некоторые из них на экран за один раз, и мы хотим только те, что на экране, чтобы быть активными. Что ж использовать трюк с прикрепленным свойством, чтобы сделать это без необходимости писать обычай код каждый раз, когда мы хотим активировать и деактивировать модели ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...