C# 复选框绑定速度慢
我在这里有点为难(没有双关语的意思);我收集了大量视图模型(500+),它们使用C# 复选框绑定速度慢,c#,.net,wpf,xaml,checkbox,C#,.net,Wpf,Xaml,Checkbox,我在这里有点为难(没有双关语的意思);我收集了大量视图模型(500+),它们使用ItemsControl和WrapPanel作为ItemsPanelTemplate显示。每个视图模型都公开一个布尔值?,其值绑定到用户界面上复选框的IsChecked属性 问题是。。。每当我试图一次更新所有复选框时,它的速度都非常慢。更新500个项目的列表几乎需要10秒。如果我在一个单独的线程中运行更新代码,我几乎可以看到复选框一个接一个地更新 有谁能告诉我为什么这个过程如此缓慢,以及我如何改进它 我认为,Wrap
ItemsControl
和WrapPanel
作为ItemsPanelTemplate
显示。每个视图模型都公开一个布尔值?
,其值绑定到用户界面上复选框的IsChecked
属性
问题是。。。每当我试图一次更新所有复选框时,它的速度都非常慢。更新500个项目的列表几乎需要10秒。如果我在一个单独的线程中运行更新代码,我几乎可以看到复选框一个接一个地更新
有谁能告诉我为什么这个过程如此缓慢,以及我如何改进它
我认为,WrapPanel
的非虚拟化性质可能是有罪的一方。但是,当我绑定到IsEnabled
属性而不是IsChecked
时,我看到了一个有趣的结果;也就是说,将IsEnabled
的值更改为true的速度与预期的一样慢,但更改为false的速度是瞬间发生的。这让我怀疑复选框动画是否有问题,因为就我所知,禁用复选框时没有动画,但启用复选框时有动画。分析表明,绝大多数时间都花在PropertyChangedEventManager.OnPropertyChanged()
方法上
下面的示例代码,我不幸被迫使用.NET 3.5:
XAML:
慢代码:
foreach (SampleViewModel model in ChildItems)
{
model.IncludeInPrinting = false;
}
编辑:值得一提的是,每当我选中所有复选框或取消选中所有复选框时,我也会看到内存使用量激增~10MB
编辑:下面的性能分析似乎证实了动画确实是一个问题。
我想看看下面的控件,它是CodePlex上的开源控件
(注意:我没有虚拟化包装面板的附加)
由于您使用的视图模型数量众多,这将大大提高您的性能。您可以尝试禁用所有项目的属性通知,更改所有属性,然后引发NotifyCollectionChangedAction。在包含所有项目的集合上重置。@Dowhilef请原谅我的无知,但是,我如何在可观察收集
上引发NotifyCollectionChangedAction.Reset
?@Micah Hahn,我在.NET 3.5和.NET 4中尝试了你的代码。我花了2-3秒的时间勾选/取消勾选了10000个复选框。@KaiWang您运行的是带有Aero动画的操作系统吗?正如我在上面的评论中提到的,我无法让这个自定义控件工作。我得到了这里提到的同样的例外,但被接受的答案并没有解决它。
public class SampleViewModel : INotifyPropertyChanged
{
private Boolean? _includeInPrinting;
public Boolean? IncludeInPrinting
{
get
{
return _includeInPrinting;
}
set
{
if (_includeInPrinting != value)
{
_includeInPrinting = value;
RaisePropertyChanged(() => IncludeInPrinting);
}
}
}
}
foreach (SampleViewModel model in ChildItems)
{
model.IncludeInPrinting = false;
}