使用DataTemplates的ListBox更新性能问题

时间:2014-09-08 08:28:50

标签: c# wpf mvvm listbox datatemplate

我在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变大时的性能影响。

听到其他一些想法会很有趣。

这是我的第一个问题,请告诉我您是否需要有关我的方案的更多信息。

0 个答案:

没有答案