私は、WPF UserControl を含む単一の ElementHost を持つ Windows Forms アプリを持っています... WPF には非常にシンプルな ListView があります:
<ListView Margin="4" ItemsSource="{Binding Notifications}">
<ListView.View>
<GridView>
<GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" />
<GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" />
<GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" />
<GridViewColumn Header="City" DisplayMemberBinding="{Binding City}" />
<GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" />
<GridViewColumn Header="Zip" DisplayMemberBinding="{Binding Zip}" />
</GridView>
</ListView.View>
</ListView>
ソースに 10 個のアイテムがある場合、フォームは 1 秒未満で読み込まれます。ソースに 1000 個のアイテムがある場合、7 秒かかります。タイマーは読み込み時間のみを考慮します (アイテムを取得するのにかかる時間は考慮しません)。
私の質問は次のとおりです。
ElementHost を使用するとパフォーマンスが悪夢になるのでしょうか?
WPF データバインディングはパフォーマンスの悪夢ですか?
ListView はダメですか? (ちなみに、WPFToolkit の DataGrid でも同じ結果になります)?
ベストアンサー1
仮想化を使用する
<ListView ItemsSource="{BindingNames}"Name="lv">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<!--<StackPanel/>
If StackPanel was used, the memory consumed was over 2GB and dead slow.
-->
<VirtualizingStackPanel>
<!--Memory footprint is only 200 mb-->
</VirtualizingStackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>