なんで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は楽しい。使いこなせれば楽しい。得意とか、ニッチとかじゃなく、楽しいからやりたい。ただそれだけです。