上次我开始实施模型视图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;
}
}
}
答案 0 :(得分:3)
如果您有大量物品,那么 只想保留可见物品 生活。我们将通过提供模型来实现这一目标 激活和取消激活那些功能 控制何时生效。 (...)
假设我们在ListBox中拥有数千个模型。这只是 只会展示其中的一些 屏幕一次,我们只想要 屏幕上的活动。好 使用附加的属性技巧来做 这无需编写自定义 每次我们想要激活时的代码 停用模型......
最近,Bea Stollnitz也为这个问题提供了解决方案here。 我希望这对你有用。