Model-View-ViewModel 성능 문제
-
05-07-2019 - |
문제
지난번에 구현을 시작했을 때 모델 보기 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도 이 문제에 대한 솔루션을 제공합니다. 여기.이것이 당신에게 도움이 되기를 바랍니다.
제휴하지 않습니다 StackOverflow