「Androidは電気羊の夢を見るか」を読みたい管理者のブログ

仕事などでの色々な発見を記事にしてます。不定期更新。

なんでPanelにはItemsSourceを指定できないの?

WPFの小ネタ
やっぱりWPFは使ってて面白い技術だと思うわけですよ。
使いこなせるかはともかく。
今回は最近発見したネタじゃないのであっさりいきます。

結論から述べるとListBoxはItemsControlを継承したクラスなのに対してPanelはPanelなんですね。
何が違うかというとPanelはXAML内でアイテム(UIElement)を配置するのに対してListBoxはItemsSource(ViewModelが持つデータ)を指定するのが大きな違い。
でも似てるんですよね。要素を並べるという意味で。

最近よく訪問するこのサイト
grabacr.net
によると、ItemsSourceの中にPanelを持つ。
ItemsControlのItemsPanelプロパティなんですが、ItemsControlの持つデータの配置を指定できちゃう。

PanelとItemsControlの実装上の違いはこんな感じ

<StackPanel>
   <TextBlock Text="テキスト1">
   <TextBlock Text="テキスト2">
</StackPanel>
<ListBox ItemsSource ={Binding Items}/>

StackPanelがXAML上で子要素を指定してるのに対してListBoxがViewModelのデータをBindingしてるのがわかります。

なんでこんなこと疑問に思ったんだろうと、思いだしてみるに、ItemsControlにListBox風スタイルが適用できないかなーって思ったのがきっかけでした。
ListBoxだと選択状態とか出てきて面倒くさいのでStyleを継承したいなーと。
違うんですよね。ListBoxからListBoxの機能を使えなくすればいい。ついでに言ってしまうとListBoxも色々カスタムできてしまう。

このことを発見した当時、深い感動を覚えたのを覚えてます。その感動はいつしか「当たり前のこと」になって、感動したことさえ忘れてしまう。

だから人々は今日も日記を書き続けるんだと思います。

WPFは楽しい。使いこなせれば楽しい。得意とか、ニッチとかじゃなく、楽しいからやりたい。ただそれだけです。