我在ListBox中渲染项目时遇到了性能问题(使用WrapPanel作为ItemsPanel),并希望有人知道如何修复/改进它。
方案: 在我的视图中,我有一个ListBox,如下所示:
<ListBox ItemsSource="{Binding MyCollection}">
<ListBox.ItemTemplate>
<DataTemplate DataType = MyModel>
<Chart XAxisMaximum="{Binding Path=DataContext.AxisLimits.XMax, RelativeSource={RelativeSource Mode = FindAncestor, AncestorType={x:Type MyView}}}"
YAxisMaximum="{Binding Path=DataContext.AxisLimits.YMax, RelativeSource={RelativeSource Mode = FindAncestor, AncestorType={x:Type MyView}}}">
</Chart>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True">
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
我的DataTemplate是一个图表控件,其中XAxis和YAxis的最大值可以绑定到ViewModel上的某些属性,这样可以正常工作。 MyModel包含ObservableCollection,它将在图表中显示为DataPoints。 另外,我有一个&#34; Zoom&#34;按钮,它将调整ViewModel上的XMax和YMax属性,从而导致View上的更新。 请注意,XMax和YMax不是MyModel的一部分,因此我必须使用RelativeSource设置Binding。
问题: 一旦我在缩放内部有大约20个图表变得非常慢,因为图表将立即全部更新。
问题: 有没有人知道如何通过顺序更新每个元素来提高性能?我想过将XMax和YMax属性移动到MyModel(然后使用DispatcherTimer一个接一个地更新MyModel对象),但我认为将它们放在ViewModel上会更清晰。 另一种方法是使用像here这样的VirtualizingWrapPanel,这可能会减少MyCollection变大时的性能影响。
听到其他一些想法会很有趣。
这是我的第一个问题,请告诉我您是否需要有关我的方案的更多信息。