Model-View-ViewModel性能问题

时间:2009-07-29 14:54:23

标签: wpf performance mvvm

上次我开始实施模型视图ViewModel 以便轻松使用WPF。 我不得不说,它很优雅,但有一点我必须要说。 在使用MVVM时,我注意到性能问题

在许多项目的情况下,将原始对象包装到“可查看”对象中可能会很昂贵。 我最近有一个包含大约20 000项的ListView。创建视图需要几秒钟。 我做错了什么或者它是合乎逻辑的。如果是这样,如何解决这个问题?

我的示例代码:

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 个答案:

答案 0 :(得分:3)

part 6 of his series about MVVM中的Dan Crevier(MVVM的第一次出现,他称之为DM-V-VM ......)触及了这个话题:

  

如果您有大量物品,那么   只想保留可见物品   生活。我们将通过提供模型来实现这一目标   激活和取消激活那些功能   控制何时生效。 (...)

     

假设我们在ListBox中拥有数千个模型。这只是   只会展示其中的一些   屏幕一次,我们只想要   屏幕上的活动。好   使用附加的属性技巧来做   这无需编写自定义   每次我们想要激活时的代码   停用模型......

最近,Bea Stollnitz也为这个问题提供了解决方案here。 我希望这对你有用。