我在这里有点束缚(没有双关语意);我有大量的视图模型(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
编辑:下面的表现分析似乎证实动画绝对是个问题。
答案 0 :(得分:0)
我会看一下CodePlex上开源的以下控件。
http://virtualwrappanel.codeplex.com/(注意:我与Virtualizing Wrap Panel没有任何关系)
由于您正在使用大量的视图模型,这将大大提高您的性能。