C# 复选框绑定速度慢

C# 复选框绑定速度慢,c#,.net,wpf,xaml,checkbox,C#,.net,Wpf,Xaml,Checkbox,我在这里有点为难(没有双关语的意思);我收集了大量视图模型(500+),它们使用ItemsControl和WrapPanel作为ItemsPanelTemplate显示。每个视图模型都公开一个布尔值?,其值绑定到用户界面上复选框的IsChecked属性 问题是。。。每当我试图一次更新所有复选框时,它的速度都非常慢。更新500个项目的列表几乎需要10秒。如果我在一个单独的线程中运行更新代码,我几乎可以看到复选框一个接一个地更新 有谁能告诉我为什么这个过程如此缓慢,以及我如何改进它 我认为,Wrap

我在这里有点为难(没有双关语的意思);我收集了大量视图模型(500+),它们使用
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;
}