私のアプリケーションには、要素として Wpf コントロールを含むグラフ (カスタム Wpf パネル) があります。要素は、Wpf コントロールから派生したカスタム コントロールです。DataTemplate は、コントロールをビュー モデルに関連付けます。ビュー モデル コレクション「GraphElements」は、以下に示すように itemsControl にバインドされます。
<ItemsControl x:Name="PART_GraphItemsControl" Grid.Column="1"
VerticalAlignment="Stretch"
HorizontalAlignment="Left"
ItemsSource="{Binding Path=GraphElements}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:GraphDesignerPanel HorizontalAlignment="Stretch"
VerticalAlignment="Top" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
グラフの要素は 2 ~ 500 の範囲で変化します。アプリケーションの特定のモードでは、要素の値が表示されます。値を表示するために、要素の ViewModel はINotifyPropertyChanged.PropertyChanged("VariableValue")
問題: グラフに 100 個以上の要素がある場合、各要素ビュー モデルは INotifyPropertyChanged.PropertyChanged を起動して、要素の値を表示します。これにより、MeasureOverride が 100 回以上呼び出され、メモリとパフォーマンスの問題が発生します。
MeasureOverride 呼び出しの数を減らすにはどうすればよいですか?
グラフ要素の値表示の XAML:
<TextBlock
Text="{Binding Path=VariableValue, StringFormat={}({0})}" Width="60"
FontSize="11" Name="txtBlk">
</TextBlock>
VariableValue が null の場合、上記の TextBlock は折りたたまれます
<DataTrigger Binding="{Binding Path=VariableValue}" Value="{x:Null}">
<Setter TargetName="txtBlk" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
更新:この問題は、以下のリンクのサンプルで再現可能です。ダウンロード、ビルド、デバッグ。アプリが開いたら、Window.xaml.cs MeasureOverride にブレークポイントを設定します。アプリに戻り、「Click Me」ボタンを押します。ブレークポイントは 11 回ヒットします。
http://sivainfotech.co.uk/measureoverrideissue.zip
どんなアイデアでも大歓迎です。