Hatena::Groupmediaforcelabs

御手洗の開発記録

 | 

2010-03-26

Row展開処理メモ 第二弾-DataGridの仮想モードに注意

| 17:53

お久しぶりです。

御手洗です。

ずいぶんブログをご無沙汰してしまいました。

現場作業が落ち着いてきたので、不定期ではありますがブログの更新を再開したいと思います。

今回は、ずっと書きたかったDataGridの仮想モードについてです。

DataGridの仮想モードに注意

DataGridやListBoxなどには、仮想モードという機能が実装されています。

仮想モードとは、非常に大きな表形式のデータをDataGridに表示する際に、表示に必要な行のみインスタンスを作成し、必要になったらそのインスタンスを再利用するという機能です。*1

この機能自体はいいと思うのですが、現在のSilverlight3ではこの仮想モードをオフにすることができないのです。

そのおかげで苦労してCellの展開をできるように実装したDataGrid(前回の記事を参照)に問題が発生してしまいました。

問題とは以下の通りです。

まず、何個かCellを展開しておきます。

f:id:mitarai2009:20100326175044p:image

そしてスクロールします。

すると、展開してないはずのCellもスクロールされてしまいます。

f:id:mitarai2009:20100326175038p:image

f:id:mitarai2009:20100326175034p:image

これには、かなりハマりました。

いろいろなところにVirtualizationMode.Standardを設定しても全然この設定が有効になりませんでした。(VirtualizationModeの設定方法が間違えていたのかもしれませんが・・・)

そもそも、VirtualizationMode.Standardはこの仮想モードを無効にする設定ではないのでしょうか。

結局、無効にする方法はわからなかった(ソースも見れないし・・・)のでDataGridのスクロールバーを無効にして、ScollViewerをかぶせることによってこの問題を回避しました。

f:id:mitarai2009:20100326175028p:image

f:id:mitarai2009:20100326175026p:image

f:id:mitarai2009:20100326175024p:image

たかだか30行ぐらいの表示で仮想モードなんて使わなくてもいいのに、無理やり使わされるのはどうなんでしょう。

簡単に無効にするオプションもないし、できればSilverlight4では簡単に無効にするオプションをつけてほしいですね。

ちなみに、Cellを取得してVirtualizingStackPanelのイベントからインスタンスを随時生成する、なんてやり方をすればもしかしたらこの問題を解決できるのかもしれません。

しかし、無効にしたいだけなのにそんなコードを書かないといけないのは面倒ですよね。

できれば、プロパティで指定するだけで簡単に有効/無効にしたいです。

まとめ

DataGridやListBoxなどのコントロールには仮想モードという機能があるというのを頭に置いて開発したほうがよさそうです。

全然まとめられてないですが、今日はこの辺で。

ulnmbvkcseulnmbvkcse2014/12/03 18:27rnksynfejbgpsdfmbct, <a href="http://www.qyfholrlen.com/">kgncggjfnt</a> , [url=http://www.jspmrjzsyk.com/]viurciywqy[/url], http://www.jijegsukbg.com/ kgncggjfnt

 |