CheckBox绑定慢

时间:2014-01-16 14:48:18

标签: c# .net wpf xaml checkbox

我在这里有点束缚(没有双关语意);我有大量的视图模型(500+),使用ItemsControl显示WrapPanel作为ItemsPanelTemplate。每个视图模型都公开一个Boolean?,其值绑定到用户界面上IsChecked的{​​{1}}属性。

问题在于......每当我尝试立即更新所有复选框时,它都非常慢。几乎10秒钟更新500个项目的列表。如果我在一个单独的线程中运行更新代码,我几乎可以看到复选框一个接一个地更新。

任何人都可以告诉我为什么这个过程如此缓慢以及我如何改进它?

我认为CheckBox的非虚拟化性质可能是有罪的一方。但是,当我绑定到WrapPanel属性而不是IsEnabled时,我看到了一个有趣的结果;即将IsChecked的值更改为true会如预期的那样缓慢,但会立即更改为false。这让我怀疑复选框动画是否有问题,因为据我所知,在禁用复选框时没有动画,但启用时有。分析表明绝大部分时间花在IsEnabled方法上。

下面的示例代码,我很遗憾被迫使用.NET 3.5:

XAML:

PropertyChangedEventManager.OnPropertyChanged()

视图模型:

<ItemsControl ItemsSource="{Binding ChildItems}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type SampleViewModel}">
            <CheckBox IsThreeState="True" IsChecked="{Binding Path=IncludeInPrinting, Mode=OneWay}" />
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>

慢代码:

public class SampleViewModel : INotifyPropertyChanged
{
    private Boolean? _includeInPrinting;
    public Boolean? IncludeInPrinting
    {
        get
        {
            return _includeInPrinting;
        }
        set
        {
            if (_includeInPrinting != value)
            {
                _includeInPrinting = value;
                RaisePropertyChanged(() => IncludeInPrinting);
            }
        }
    }
}

编辑:对于它的价值,每当我检查所有内容或取消选中所有复选框时,我也会看到内存使用量激增。 〜10MB

编辑:下面的表现分析似乎证实动画绝对是个问题。 Performance Analysis Hot Path

1 个答案:

答案 0 :(得分:0)

我会看一下CodePlex上开源的以下控件。

http://virtualwrappanel.codeplex.com/(注意:我与Virtualizing Wrap Panel没有任何关系)

由于您正在使用大量的视图模型,这将大大提高您的性能。