문제

지난번에 구현을 시작했을 때 모델 보기 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;                
            }
        }
    }
도움이 되었습니까?

해결책

댄 크레비어 MVVM에 관한 시리즈 6부 (MVVM의 첫 등장 중 하나인 그는 이를 DM-V-VM이라고 부릅니다...) 다음 항목을 터치하세요.

많은 항목 세트가있는 경우 가시 품목을 생중계하기 만하면됩니다.우리는 모델이 생방송시를 제어하는 ​​기능을 활성화시키고 비활성화함으로써이를 수행 할 것입니다.(...)

ListBox에 수천 개의 모델이 있다고 가정해 보겠습니다.한 번에 화면에 몇 개만 표시 할 뿐이며 화면에있는 것만 활성화되기를 원합니다.우리는 첨부 된 속성 트릭을 사용하여 모델을 활성화하고 비활성화 할 때마다 사용자 정의 코드를 작성하지 않고도이를 수행합니다.

최근에는 Bea Stollnitz도 이 문제에 대한 솔루션을 제공합니다. 여기.이것이 당신에게 도움이 되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top