在ListView中使用WPF组合框的性能

时间:2011-05-02 12:06:01

标签: wpf performance combobox binding

我想知道我是否遗漏了一些明显的东西。

我有一个简单的窗口,里面有一个包含3列的ListView。 一个显示文本,另外两个包含组合框。

ListView有约。 500个记录和组合框都来自同一个联系人列表,大约有。其中有8,000条记录。

我正在使用MVVM。

此窗口需要永久打开,一旦打开它实际上是冻结的(它移动得太慢)

对数据库的查询需要十秒钟(我在VM完全加载时记录)然后打开窗口需要两到三分钟。 我确保将List<T>中的两个列表存储在我的VM中,以确保它不会重新处理数据或类似的内容。

如下所示。我已经尝试过明确使用虚拟化堆栈面板,但这没什么用。

感谢您的帮助

        <DataTemplate x:Key="ComboboxItemTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Image Grid.RowSpan="3" Source="{Binding ImageURL, IsAsync=True}" Width="50" />
            <TextBlock Grid.Column="1" Text="{Binding Name}" />
            <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Email}" />
            <TextBlock Grid.Column="1" Grid.Row="2" Text="{Binding CampusName}" />
        </Grid>
    </DataTemplate>
    <ListView ItemsSource="{Binding MainList}" IsSynchronizedWithCurrentItem="True" Grid.RowSpan="2">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.View>
            <GridView>
                <GridViewColumn Width="200" Header="Internal">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                                <TextBlock Text="{Binding MName}" />
                                <TextBlock Text="{Binding CampusName}" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="200" Header="Contact1">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Source={StaticResource VM}, Path=ContactList, IsAsync=True}" SelectedValue="{Binding HisContactID}" SelectedValuePath="id" ItemTemplate="{StaticResource ComboboxItemTemplate}" Background="{Binding HisColor}" Margin="0,82,0,115" Grid.Row="1" Grid.Column="1">
                                <ComboBox.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <VirtualizingStackPanel />
                                    </ItemsPanelTemplate>
                                </ComboBox.ItemsPanel>
                            </ComboBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="200" Header="Contact2">
                ...
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

1 个答案:

答案 0 :(得分:0)

我有同样的问题,最后想出来......

恰好ListView嵌套在Infragistic TabControl中,并且每次在ListView中绑定某些内容(即:ComboBoxes)时,TabControl的“SelectionChange”都会被触发,导致延迟......

我还使用原生的Microsft TabControl进行了测试,但我得到了相同的行为,但性能稍微高一些。

我通过验证SelectionChangedEventArgs解决了这个问题...确保e.AddedItems在处理之前只包含“TabItem”(而不是ComboBox)。

希望它有所帮助,