Graham Knight 氏は現在,軽量でパフォーマンスの高い WPF 用データグリッドを開発中だ。WPF Table View と呼ばれるこのデータグリッドは Microsoft Public License の下,CodePlex で公開されている。
InfoQ: 自身でデータグリッドを構築しようと思い立つに至った WPF の不満点は,どのようなものだったのでしょう?
WPF のデータグリッドを使わなかった最大の理由はパフォーマンスです。動的に定義する列とデータテンプレートを使って 100,000 行以上のビューを実現する必要があったのですが,これをデータグリッドに設定した途端,ユーザエクスペリエンスがとんでもないものになりました。商品として販売されているグリッドコントロールもいくつか試してみて,パフォーマンスは良くなったのですが,私のニーズに合わせるように理解するには複雑すぎて難しかったのです。
InfoQ: あなたのデータグリッドの方針は何でしょう? 拡張のためのベアボーンなのか,あるいは初期状態でおおよそのユースケースを満足できるような,機能セットの充実を目指しているのでしょうか?
間違いなくベアボーン・ソリューションですね。様々なカラムタイプや編集モード,テーマパックというものは持っていません。この手のものは,データテンプレートを使えばごく簡単に実装できる機能ですから,コンポーネント側で用意しておく必要はないのです。
ユーザが容易に理解できて,しかもテンプレートデータのレンダリングパフォーマンスの高い,シンプルなグリッドコンポーネントを作りたいと思っていました。Table View を十分に活用するためには,データバインディングとデータテンプレートについていくらか理解する必要はありますが, これらはどのコントロールを利用するためにも必要な WPF の基本なのです。
将来的には機能拡張を行うことになるでしょうが,速度や使い勝手の基本的なシンプルさを犠牲にするつもりはありません。
InfoQ: 100,000 行というのは,ユーザにとってはずいぶん多い情報量だと思うのですが,これほどの情報を一度に表示する必要があるのでしょうか?
私は現在,金融関係の開発をしています。大規模なポートフォリオ全体の損益レポートをリアルタイムで表示しなければなりません。株価の変動に伴って,TableView がレポートの各行の表示を頻繁に更新しています。損益情報のマルチレベルの集計値の計算と表示も行わなければなりません。ですから,十分なパフォーマンスを確保するためには,すべてのデータをメモリ上にロードしておく必要があるのです。
InfoQ: では,不可欠な機能は何でしょう?
パフォーマンスと仮想化ですね。私の主要件はデータの編集より表示にあります。TableView をデータ編集に使用できなくもありませんが,ビューモデルとデータテンプレートを自身で書く必要があります。
TableView のモデルはシンプルなものになっています。元データと表示データの間には,ほんの少しのレイヤがあるだけです。仮想化はパフォーマンス上の理由に加えて,大量のデータを管理する必要から採用しています。TableView では表示している部分の行コンテナだけを生成して,ユーザのスクロール操作に伴ってそれを再利用しているのです。この方法でコントロールの使用するメモリとリソースの量を大幅に削減しています。
ItemsControl や非表示コントロールの動作について学ぶ上で,これは絶好の機会にもなりました。
InfoQ: 仮想化スタックパネルなどを使うことはできましたか,あるいは,スクラッチからすべて自力で構築しなければならなかったのでしょうか?
仮想化スタックパネルを使用しています。ここで車輪を再発明する必要はありませんでしたし,ItemsControl やコントロールテンプレート,非表示コントロールに関する Dr WPF の素晴らしい連載記事が,内部構造を理解する上で大変役に立ちました。
InfoQ: こでまでこのプロジェクトに,どの程度の時間を費やしているのでしょう?
多分1ヶ月程度です。ただしバックグラウンドで行ってきたことも含めれば,6ヶ月以上にはなるでしょうね。グリッド形式のコントロール開発に伴うすべての面の折り合いをどうやって付けるかという調査と,Listbox や ListView,あるいは Data Grid など既存のコンポーネントの動作を学ぶのに費やした時間がほとんどです。