Wpf GridViewColumn的CellTemplate的性能问题

Wpf GridViewColumn的CellTemplate的性能问题,wpf,performance,listview,gridview,Wpf,Performance,Listview,Gridview,我正在使用一个视图设置为GridView的ListView来在动态生成的列中显示项目。ListView的虚拟化已启用。对于本例,我希望最多显示10行50列(但列数是动态的) 我要做的第一件事是在循环中的代码隐藏中创建列。 “Items”只是我的视图模型中一行字符串的可观察集合 int index = 0; foreach(Header header in Headers) { GridViewColumn column = new GridViewColumn(); column.He

我正在使用一个视图设置为GridView的ListView来在动态生成的列中显示项目。ListView的虚拟化已启用。对于本例,我希望最多显示10行50列(但列数是动态的)

我要做的第一件事是在循环中的代码隐藏中创建列。 “Items”只是我的视图模型中一行字符串的可观察集合

int index = 0;

foreach(Header header in Headers)
{
  GridViewColumn column = new GridViewColumn();
  column.Header = // the view model of the header;
  column.HeaderTemplate = Resources["HeaderTemplate"] as DataTemplate;
  column.DisplayMemberBinding = new Binding("Items" + "[" + index + "]");
  m_MyGridView.Columns.Add(column);

  index++;
}
现在,当我更改ListView的ItemsSource时,数据会快速更新

不幸的是,每个单元格中的每个字符串都必须格式化(字体颜色、前景等)。所以我不能使用DisplayMemberBinding,而是使用CellTemplate为每个单元格分配一个DataTemplate

为此,我在我的控件中用xaml创建了一个保存ListView的DataTemplate。这只包含一个TextBlock,它与单元格视图模型的属性有一些绑定,用于定义TextBlock的字符串样式。 现在,Items不仅仅是字符串的集合,而是CellViewModels的集合,这些模型不仅包含要显示的值,还包含如何显示的信息。然后将此信息绑定到DataTemplate中

CellTemplate在代码中设置并分配给每个GridViewColumn的CellTemplate:

foreach(Header header in Headers)
{
  GridViewColumn column = new GridViewColumn();
  column.Header = // the view model of the header;
  column.HeaderTemplate = Resources["HeaderTemplate"] as DataTemplate;
  column.CellTemplate = createCellTemplate(index);
  m_MyGridView.Columns.Add(column);

  index++;
}

DataTemplate getCellTemplate(int index)
{
  FrameworkElementFactory elementFactory = new FrameworkElementFactory (typeof (ContentControl));

  elementFactory.SetBinding(ContentControl.ContentProperty, new Binding("Items" + "[" + index + "]"));

  DataTemplate dt = Resources["ValueTemplate"] as DataTemplate;
  elementFactory.SetValue(ContentControl.ContentTemplateProperty, dt);
  DataTemplate dataTemplate = new DataTemplate ();
  dataTemplate.VisualTree = elementFactory;

  return dataTemplate;
}
当我这样做时,当我更改ListView的ItemsSource时,事情会变得非常缓慢。现在,每当我更改ItemsSource以显示不同的数据时,渲染新单元格几乎需要一秒钟的时间

有没有办法加快速度?我曾考虑使用段落在CellViewModel中设置格式化字符串,但不幸的是DisplayMemberBinding只支持字符串,因此我必须使用CellTemplate

编辑:下面是我使用的listview:

<ListView ItemsSource="{Binding ElementName=Control, Path=ItemViewModels}">
  <ListView.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel IsItemsHost="True" VirtualizingStackPanel.IsVirtualizing="True" />
    </ItemsPanelTemplate>
   </ListView.ItemsPanel>
   <ListView.View>
     <GridView x:Name="m_MyGridView"/>
   </ListView.View>
</ListView>

以及单元格的数据模板:

<DataTemplate x:Key="ValueTemplate">
    <Border Background="{Binding Path=BackgroundColor">
        <TextBlock Text="{Binding Path=Value}"
             Foreground="{Binding Path=ForegroundColor}"
             FontStyle="{Binding Path=FontStyle}"
             FontWeight="{Binding Path=FontWeight}"
        </TextBlock>
    </Border>
</DataTemplate>


getCellTemplate
是一种非常昂贵的方法。您没有显示任何可查看的相关xaml。