【问题标题】:Performance with WPF Combo Box inside a ListViewListView 内 WPF 组合框的性能
【发布时间】:2011-08-16 22:44:50
【问题描述】:

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

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

ListView 大约有。 500 条记录和组合框都从同一个联系人列表中提取,该联系人列表大约有 500 条记录。 8,000 条记录。

我正在使用 MVVM。

这个窗口需要永远打开,一旦打开,它实际上是冻结的(它移动得很慢)

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

如下所示。我已经尝试明确使用虚拟化堆栈面板,但这并没有太大帮助。

感谢您的帮助

        <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>

【问题讨论】:

    标签: wpf performance combobox binding


    【解决方案1】:

    我也遇到了同样的问题,终于解决了……

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

    我还使用本机 Microsft TabControl 进行了测试,我得到了几乎相同的行为,但性能稍微好一些。

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

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多