Wpf GridViewColumn的CellTemplate的性能问题
我正在使用一个视图设置为GridView的ListView来在动态生成的列中显示项目。ListView的虚拟化已启用。对于本例,我希望最多显示10行50列(但列数是动态的) 我要做的第一件事是在循环中的代码隐藏中创建列。 “Items”只是我的视图模型中一行字符串的可观察集合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
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。