SilverLight WPF クロス表を作る。

別にクロス表を作ったというわけでもないけど、それっぽいことをやったので、メモ。
縦横に動的に伸びる表をどうやったら作れるか?ということ。

最終的にこういうのを作る。

結論から言うと、ポイントは、データ構造をちゃんと作る、StackPanelを使うこと、Borderを使って、横幅の固定化、ItemsControlの入れ子化だ。

綺麗な縦横の線で区切られているのだからはじめは、Gridを使おうかと思ったけど、どうやって、動的に行と列を増やすことができるの?というところで詰まった。
そこで、StackPanelとBorderで横幅の固定化を行うという戦略と、ItemsControlの入れ子かを使って縦横を生成しようということを試みた。

ソース。
https://gist.github.com/kiichi54321/5290813

まずは、表示するためのデータ構造づくり。
ClusterTableクラスを大元として、ヘッダに当たる列とデータの中身に当たるところを定義する。
そして、ヘッダは、オブジェクトにしているけど、事実上はテキストが並んでいるだけ。拡張性も考えると、オブジェクトにしたほうがいいという判断。
LayerGroupクラスは、一列を表現する。Nameパラメータは、見出しに使う用である。
本来のクロス表では、ここまででいいのだが、こっちの要件として、さらに中身がテキストの列である必要があったので、Comunityクラスのリストをもたせている。
そのため、ソースでは、ItemsControlの三段入れ子になっている。

次にXAMLファイル。
縦横の大きさが未定のため、とりあえず、ScrollViewerで囲った。
ContentControlで、ClusterTableクラスをぶち込み先を明示化させる。
まずは、ヘッダのところをの処理。StackPanelの入れ子を作って、Borderで一番隅の空白のところを作る。
ItemsControlで、横を埋める。必ずBorderで枠の大きさを指定する。ItemsControl.ItemsPanelでStackPanelの指定もポイント。
次、行。はじめの行の名前のところは別でつくる。そして、入れ子のItemsControl データ構造としてちゃんと入れ子のリストにしておけば、こういう風に作れる。
さらに、その中でも、ItemsControlの入れ子はやれて、やっている。

なんか解説は飽きたのでこのくらいで。

とりあえず、ItemsControlの入れ子を使えば、結構色々できることがわかった。