VirtualCollection によるロードオンデマンド
VirtualCollectionは、一般的なロードオンデマンドのシナリオを簡単に実現するために用意されたフレームワークで、NetAdvantage Silverlight LOBに含まれています。
標準のDataGridやxamWebGrid などのデータグリッドコントロールに大量のデータを読み込むときに、このVirtualCollectionをバインドすることによってデータソースを間接的にコントロールし、部分的なデータロードやデータのキャッシングを行えるようにします。
通常、データグリッドコントロールに情報を表示するときは、ItemsSourceプロパティに何らかのコレクションやリストのオブジェクトをバインドしますが、ロードオンデマンドが必要なシナリオではVirtualCollectionオブジェクトをItemsSourceプロパティにバインドします。
データグリッドに最初にデータを表示するときや、スクロール処理やページングによって追加のデータ表示が必要になったとき、VirtualCollectionのItemDataRequestedイベントが発生するので、このタイミングで必要なデータをデータソースに対して要求し、取得したデータをVirtualCollectionに追加することができます。取得したデータはVirtualCollectionの内部でキャッシュされるため、重複する不要なデータについてのリクエストを抑制することができます。また、VirtualCollectionの初期化時に想定される最大件数を設定できるため、トータル行数に対して適切な縦スクロールバーの幅やページングにおけるページ数をユーザーに提供することができます。
VirtualCollection を使って
DataGridのページング処理をロードオンデマンド化する
それでは実例を挙げて使い方を見ていきましょう。標準のDataGridを使い、ページング機能と組み合わせたロードオンデマンドの実装を例にとります。
最初に、Silverlightプロジェクトに必要な参照設定を追加します。VirtualCollection機能を使う場合、Infragistics.SilverlightとInfragistics.Silverlight.VirtualCollectionの2つのアセンブリーが必要となります。
次に、テスト用の画面を構成します。次のようにSilverlight標準のDataGridとDataPagerを配置したXAMLを作成します。
続いて必要なコードビハインドを処理の流れに沿って説明します。まずはクラス定義とコンストラクタ、ロード処理といった初期処理の部分を見てみましょう。ここではVirtualCollection<TestData>のインスタンスをフィールドとして保持し、UserControl.Loadedのタイミングでサービスの初期化を行っています。
ここで使用するサービスクラスの手続きについても確認しておきます。通常、データ取得用のサービスはWCFサービスなどWebサーバ側に配置することがほとんどですが、今回のサンプルでは以下のpublicメンバーを持ったTestServiceというサービスのモックアップクラスをクライアント側でホストしています(ただし実際のサービス アクセスの方式と同様に、非同期モデルのメンバー構成としています)。
クライアント側のInitializeServiceメソッドでは、TestDataServiceの初期化処理とイベント設定をしています。ここで初回のサービス問い合わせとしてGetTotalRowCountAsyncを呼び出し、取得対象となるデータの総件数を取得します。
以下のInitVirtualCollectionメソッドでは、取得したデータ件数をもとにVirtualCollectionを初期化し、1回のデータロードのサイズやページングサイズを指定しています。さらに、DataGrid と DataPagerのItemsSourceにVirtualCollectionをセットします。VirtualCollectionが取り扱う最大データ数についてはコンストラクタで指定する以外にも、VirtualCollection.AnticipatedCount プロパティで指定することも可能です。
DataGridのItemsSourceにVirtualCollectionを設定したことで、以後DataGrid上にデータを表示する必要が生じたとき、自動的にItemDataRequestedイベントが起動されます。最初は「1ページ」分のデータが要求され、その後はページを切り替える度に対象ページのデータ取得が要求されます。
サービスからのデータ取得完了イベントをハンドルする以下の処理の中で、VirtualCollection.LoadItemsメソッドを呼び出してデータの追加を行います。ここではじめてVirtualCollection内の指定インデックス位置にデータが設定され、画面に表示が行われます。
以上でページングを行うDataGridに対するロードオンデマンド実装が一通り終わりました。以下のイメージはその動作スクリーンショットですが、DataPagerでページングを行ったタイミングで追加のデータリクエストが発生している様子が確認できると思います。また既に取得済みのページを再度選択した場合には、VirtualCollectionの中のキャッシュデータを参照するために、追加のリクエストが発生しません。