wpf datagrid メモリリーク
wpfのdatagridを利用してデータ表示しております。
1レコードを多段構成で表示するため、ユーザーコントロールにdatagridを配置し、グリッド内に各コントロールを配置する方法で実現しております。
チェックボックスも配置しており、スクロール時に初期化される現象が発生したため、仮想化をOFFにしております。
少ないデータ件数であれば問題ないのですが、大量データ(3500件程度)の場合には
メモリリークしてしまいます。
DataGridにチェックボックスを配置した場合の実装で、上記の事象を
改善する方法をご存知の方がいらっしゃいましたらご教授頂けると幸いです。
以下2つが実装しているxamlとなります。
★Grid_Tab_Roke_Main
ユーザーコントロールにDataGridを配置したものとして実装しています。
<UserControl x:Class="Grid_Tab_Roke_Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_XX_WPF商品管理"
mc:Ignorable="d"
d:DesignHeight="200.373" d:DesignWidth="300" Height="Auto" Width="Auto">
<DataGrid ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="False" VirtualizingStackPanel.VirtualizationMode="Standard" EnableColumnVirtualization="False" EnableRowVirtualization="False" ScrollViewer.CanContentScroll="True" ScrollViewer.IsDeferredScrollingEnabled="True" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" HeadersVisibility="None" Margin="0,0,0,0">
<DataGrid.Columns>
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:Grid_Tab_Roke_Detail />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UserControl>
★Grid_Tab_Roke_Detail
グリッド内にコントロールを配置しており、データテーブルよりバインドしています。項目は全て数点を抜粋して記載しております。
<UserControl x:Class="Grid_Tab_Roke_Detail"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Height="70" Width="1227" Background="White" Loaded="UserControl_Loaded">
<Grid>
<TextBox x:Name="Text_Roke" Text="{Binding ロケーション名, Mode=OneTime, StringFormat=\{0:N0\}}" HorizontalAlignment="Left" Height="21" Margin="56,22,0,27" TextWrapping="Wrap" VerticalAlignment="Center" Width="181" RenderTransformOrigin="0.406,0.026" Background="{x:Null}" FontFamily="Arial" VerticalContentAlignment="Center" FontWeight="Bold" MaxWidth="200" MinHeight="16" IsHitTestVisible="True" FontSize="16" Foreground="Black"/>
<TextBox x:Name="Text_HinCD" Text="{Binding 商品コード, Mode=OneTime, StringFormat=\{0:N0\}}" HorizontalAlignment="Left" Height="21" Margin="242,22,0,27" TextWrapping="Wrap" VerticalAlignment="Center" Width="62" RenderTransformOrigin="0.406,0.026" Background="{x:Null}" FontFamily="Arial" VerticalContentAlignment="Center" FontWeight="Bold" MaxWidth="150" MinHeight="16" IsHitTestVisible="True" FontSize="16" Foreground="Black"/>
<CheckBox x:Name="Chk_Sentaku" Content="選択" IsChecked="{Binding IsSelected.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="3,3,0,0" VerticalAlignment="Top" Width="48" Height="65" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"
/>
<TextBox x:Name="Text_HinNM" Text="{Binding 商品名, Mode=TwoWay, StringFormat=\{0:N0\}}" HorizontalAlignment="Left" Height="21" Margin="304,22,0,27" TextWrapping="Wrap" VerticalAlignment="Center" Width="330" RenderTransformOrigin="0.406,0.026" Background="{x:Null}" FontFamily="Arial" VerticalContentAlignment="Center" FontWeight="Bold" MaxWidth="350" MinHeight="16" IsHitTestVisible="True" FontSize="16" Foreground="Black"/>
</Grid>
</UserControl>
お礼
やはりそうですよね・・・・。 トリッキーが記述が必要ですよね!! とても参考になりました。有難う御座います。