ItemsControl で折れ線グラフのプロットは無理があり過ぎる

以前の記事で ItemsControl を利用してデータ点をプロットする方法をちょろっと紹介しましたが、
よくよく調べてみると、やっぱりデータ点が多いときは描画に時間がかかってしまいます。
そうは言ってもよくわかんないので、
簡単なサンプルを作ってみました。

まずはデータ点のクラスを次のように定義します。

折れ線グラフは 1 本だけとは限らないので、
複数本のグラフを保持できるようにしました。
GraphData クラスが複数本のグラフを保持しています。
その下層の GraphPoitns クラスが 1 本分のグラフの点を保持しています。
最下層の GraphPoint クラスがあるグラフのある点の情報を保持しています。

このクラスを用いて ViewModel でグラフを用意します。

View が表示されると同時に描画されてしまうと
グラフを表示するためにかかる時間が実感できないので、
TestCommand が実行されたら描画されるようにしておきます。

31 行目の繰り返し回数でグラフの本数が決まります。
34 行目の繰り返し回数で 1 つのグラフに対するデータ点数が決まります。
上記のコードでは 1000 点のグラフが 2 つできることになります。
グラフの形状は 36 行目で記述している通り、右肩下がりの直線グラフになっています。

蛇足ですが、ViewModelBase クラスは INotifyPropertyChanged を実装しており、
プロパティ変更ヘルパとして SetProperty<T>() メソッドが定義されています。

さて、ここからが本題です。
このグラフを表示するための View を ItemsControl を用いて次のように記述します。

最初にあるボタンは TestCommand を実行するためのものです。
つまりこのボタンを押すとグラフが描画されます。

ItemsControl は、自分の中に ItemsControl を入れるという、
少々複雑なことになっています。
上位の ItemsControl で複数本のグラフを描画するようにし、
入れ子になっている ItemsControl で 1 つのグラフに対するデータ点すべてを描画させています。

上記の ViewModel ではデータ点は 2000 個ですが、
これくらいだと大して表示に時間がかかるようには感じません。
しかし、ViewModel.cs の 34 行目の繰り返し回数を 10000 回にすると、
つまり、データ点を 20000 個にすると、
途端に表示に時間がかかってしまいます。

グラフを 1 回だけ描画するなら多少我慢できますが、
軸の移動/拡大処理等ダイナミックなグラフ表示を考えているので、
これはちょっと面白くありません。

やっぱり DrawingVisual に手を出すしかないのかな。
ItemsControl を使う方法は XAML をフル活用している感じがして
結構気に入っていたんだけど。

サンプルコード:ItemsControlSample.zip