【WPF(XAML)C#6】ListView/ListBoxの違い

※本ページはサイドバーまたは本文内にアフィリエイト広告を利用しています

セクション5はDataGridと同じく、コレクション(ItemsSource)を使って画面に表示するListViewとListBoxを紹介します。

ListView

これはC#側の設定は変えていませんがXAML側をDataGirdからListViewに変えたものです。XAMLは以下になっております。

<ListView Grid.Column="1"
          ItemsSource="{Binding gridSource}"
          Margin="0,10"
          >
    <ListView.Resources>
        <Style TargetType="{x:Type GridViewColumnHeader}">
            <Setter Property="Background" Value="Aqua"/>
        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridViewColumn Header="都道府県" DisplayMemberBinding="{Binding prefLabelPref}"/>
            <GridViewColumn Header="市区町村" DisplayMemberBinding="{Binding prefLabelPref}"/>
            <GridViewColumn Header="天気" CellTemplate="{StaticResource WeatherTemplate}"/>
            <GridViewColumn Header="気温" DisplayMemberBinding="{Binding temperature, StringFormat={}{0:N0}℃, TargetNullValue=不明}"/>
            <GridViewColumn Header="降水確率" DisplayMemberBinding="{Binding rainyPercent, StringFormat={}{0:N0}%, TargetNullValue=不明}"/>
        </GridView>
    </ListView.View>
</ListView>

DataGridと違って、パラメータは少ししか設定していませんがそれでもDataGridと比べて最初から整形されていますね。またタイトル部分はGridViewColumnHeaderのようです。

とはいえ、基本はDataGridと同じようです。確かにListViewはうちの業務でも使っていません。ざっといじってみた所、ListViewは以下ができないようです。

  • クラス特有の行のソート機能
  • 前回セクションで使っていた行の縞々の設定ができない
  • RowHeaderが存在しない

つまり初期設定は必要ない分、簡単だけどDataGridの方がカスタマイズ性が高いと思います。

ListBox

こちらは非常に汎用性の高いコレクション用クラスです。こちらはDataGridの用なヘッダーエリアが存在しないため、自分でデザインを自由に設定する事ができます。以下の画像とXAMLコードを見てください。

<ListBox Grid.Column="1"
          ItemsSource="{Binding gridSource}"
          Margin="0,10"
         >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding prefLabelPref}"/>
                <TextBlock Text="{Binding municipalityLabel}"/>
                <Image Style="{DynamicResource WeatherIconStyle}" Width="25"/>
                <TextBlock Text="{Binding temperature, StringFormat={}{0:N0}℃, TargetNullValue=不明}"/>
                <TextBlock Text="{Binding rainyPercent, StringFormat={}{0:N0}%, TargetNullValue=不明}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ListBoxは最低限だとコードがこれだけで済みますが、画像を見るとまったく整形されていない事がわかります。

コードを見て頂ければわかりますがTemplate内にStackPanelを使う等、この機能は整形も含めて作成者に任されているからです。使う場面はそこまで多くなさそうですが、自由に設計できるのでオリジナリティに満ちた画面が作れるのではないかと思います。

まとめ

いかがでしたでしょうか?コレクションを使ったBindingはDataGridと変わらないため、逆に記事は少なくなってしまいましたが、今回はここまでにしたいと思います。

次はモデル側で画面を作る?!をお送りしたいと思います。

気に入ったらシェアお願いします!

【イナコーシステムからのお知らせ】

読者様への返礼特典付き投げ銭サービス

金額に応じて特典の実用性がUP!

  • ○あなたの名前を半永久的に残せる!
  • ○あなたのブログ/動画チャンネル紹介記事を執筆・サイドバーのリンクエリアに掲載!
  • ○あなたの悩み(エンジニア、ブログなど)を通話付きでアドバイス/サポート。回数制限なし!