.NET3.0のコントローラーはUIElementという抽象化クラスで扱えることになっているのでなんでもサブクラス化できる。
ドロップダウンリストにImageがそのままAddできちゃったときはおしっこ漏らしそうなほどびっくりしたものだ。
ちょっとこれ.NET2.0でやったら3日はかかるんですけど(゚Д゚)
ならば
TreeViewにもImageやボタン、はては自作コントローラーもAddできるんでない?
まずは配列を作らなくてはいかん。
ObservableCollectionで自作コントローラーの配列を作ってTreeコントローラーにバインドしてみた。
すると確かに自作コントローラーが並んだ。
しかし階層化されない。
そりゃそうだ。
しかしどうやって・・・。うーむ。
まずは
例によって文献が超少ない中頑張って調べた。どうも
HierarchicalDataTemplateというテクニックを使うといいらしい。
ここにサンプルがある(日本語版だとなぜかサンプルプロジェクトのリンクが切れてる)。
サンプルでは
と用意されていて、大元クラスが親クラスをメンバーとして保持。
コンストラクタで親・子供・孫と、適宜追加している。
なるほど。
で、XAMLでDataTemplateではなく、HierarchicalDataTemplateとしてリソースを作っている。
親・子供・孫それぞれ定義している。
コードを見ると、ItemsResourceのところに、保持する配列のクラスが定義されていることが分かる。
なるほど。
さらにいろいろいじって分かったこと |
HierarchicalDataTemplateを定義する方法はXAMLを直に書くしかない。
階層クラスは子供・孫と用意する必要はない。自分をメンバー化すれば再帰的に階層化できる(まぁこれは普通)。 |
というわけで
という構成でクラスを作って、大元クラスで親クラスを複数用意し、Addしまくって階層構造を作り、TreeViewにバインド。
しかし
名前しか出ん(´・ω・`)
バインド時にDataTemplateであれこれいじってもダメ。
無理なのか・・・?
いやまて、そのDataTemplateのXAMLコードを調べてみよう。
良く見ると並びがオブジェクトウィンドウのWindowの並びに似ている。
そうか、ということは・・・(-_☆)キラーン
結果
<HierarchicalDataTemplate>
<UserControler>(ここにさっきまでTextBlockというコントローラーがあった)
</HierarchicalDataTemplate>
|
これだけでよい。
これだけで自作コントローラーを階層表示させることができる。
経験者なら分かるが、これは本来なら非常に面倒で果てしない作業だ。
しかし
.NET3.0ならたったの3行(いや、その上にソース引用元とか書かなきゃいけないんだけど)。
しかもロジックコードではなく、XAMLのコードだけだ。
信じられん!
なんて簡単なんだ!!!
(ToT)
ブログ一覧 |
プログラム | 日記
Posted at
2007/11/28 22:19:05