DataGridの基本的な事

DataGrid基本的な設定からメモしておく。

<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="213" Width="385"
local:WindowBehavior.UseMessageCommand="True"
local:FrameworkElementBehavior.OnLoadedCommand="{Binding LoadedCommand}"
>
<Grid>
<DataGrid AutoGenerateColumns="False"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
CanUserAddRows="False"
CanUserDeleteRows="False"
SelectionMode="Extended"
SelectionUnit="CellOrRowHeader">
</DataGrid>
</Grid>
</Window>

○AutoGenerateColumnsプロパティ;False
 列を自動生成するかどうか。便利なときは便利だけど、列ヘッダがプロパティ名そのままで出てしまう。イベントで回避する方法があるけど、MVVMには向かない(めんどくさい)。
 デフォルトでTrueなので、うっかりすると、列の数がすごいことに。

○VirtualizingStackPanel.IsVirtualizingプロパティ:True
 UI仮想化用の添付プロパティ。VirtualizingStackPanel.VirtualizationModeプロパティとセット。
DataGridは内部でVirtualizingStackPanelが利用されているので、設定推奨、とぃうか必須。
 これがないと、DataGridはデータが増えれば増えるほど、駄目な子になります。

○VirtualizingStackPanel.VirtualizationModeプロパティ:Standard
 UI仮想化のモード。Standardは標準。Recyclingは視界から消えたコンテナ(DataGridRowかその中のPresenter系)を使いまわしている感じがする。
 メモリや速度に優しいのはRecycling。だけど、レイアウトが崩れまくるのもRecycling。特に行ヘッダに番号とか表示したら、もう大変。
 ソートとか、全体がリフレッシュされるまで崩れたままという…。

○CanUserAddRowsプロパティ:False
 ユーザが意図的に行追加できるかどうか。表示専用なら、Falseに。編集や追加目的のDataGridなら、当然Trueに。
 デフォルトでTrue。

○CanUserDeleteRowsプロパティ:False
 ユーザが意図的に行削除できるかどうか。表示専用なら、Falseに。編集や追加目的のDataGridなら、当然Trueに。
 デフォルトでTrue。

○SelectionModeプロパティ:Extended
 選択する方法。Singleはセル1つ分のみ選択可能になる。Extendedで複数選択可能。
 セルのコピペ等を考えるとExtended一本になりそう。

○SelectionUnitプロパティ:CellOrRowHeader
 選択するときの単位というか括りというか。
 Cell:セルのみが選択される。
 CellOrRowHeader:通常はセル。行ヘッダをクリックすると行全体が選択される。
 FullRow:常に行全体が選択される。コピーすると、常に行全体がコピーされる。
 選択肢(セルか行全体か)を増やす意味でCellOrRowHeader。
その他、あまり使わないけど、参考までに

○IsReadOnlyプロパティ
 読み取り専用かどうかを設定したり、取得したりする。
 DataGridColumnのIsReadOnlyプロパティがデフォルトでFalseなので、「これをTrueに設定したら楽じゃないか?」なんて考えたこともあった。本当にTrueにすると、セルの選択まで不可になったりと不便な事が多いので、Trueにすることは、おそらくない。

○EnableRowVirtualizationプロパティ
 縦(行)方向へのUI仮想化を有効にする。デフォルトでTrueになっている。VirtualizingStackPanelの添付プロパティをセットで使って、ようやくマシになる。
 ただし、このプロパティを動的に変更しようとすると、エラーになるらしい。
 WPF DataGrid: EnableRowVirtualization Property dynamics
 MSの見解:もっとやばいバグを先に直すよ!だから保留ネ。
 まあ、動的に変えようという意図があまり理解できないので、放っておくに限る。

○EnableColumnVirtualizationプロパティ
 列方向へのUI可能化を有効にする。DataGridがどうにももっさりする時は、これをTrueにするとマシになることがある。
 ただし、マシになるだけ。低スペックのPCだとやっぱりもっさりする。
 仕事上でこれをTrueにしたところ、複雑なStyleやTemplateと喧嘩するらしく、派手に落ちなさるので、Falseのままに。

特長(?):列が多ければ多いほどもっさりする
DataGridは、列が少なければ、数千行くらいへっちゃら。
ただし、列が増えると途端に怪しくなってくる。
DataGridの縦スクロールが遅すぎる。
DataGridは、UI仮想化だけでなく、データ仮想化まで考えてやっと使い物になるかな。

(追記)
久しぶりに「データ仮想化」でぐぐってみたら、以下のような記事があった。
WPF Table View,パフォーマンスに優れた軽量データグリッド
CodePlex上のサイト:WPF Table View
おお、ぐぐってみるもんだ。時間があれば、試してみようっと。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m