2015年10月3日土曜日

VB WPF お勉強 06 ListBox と項目

はい、久しぶりの WPF 絡みです。
今回は、ListBox とその表示項目について、初心者レベルで書きます。
本格的にコードを書いている方や、専門的な方には、 無用な投稿になりますね。
Form から、やっと、WPF に触れて見る そんな方が対象です。


さて、今回からは、コードも、少し、載せて行きます。

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Button x:Name="Button1" Content="Button" HorizontalAlignment="Left" Margin="110,200,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
        <ListBox x:Name="ListBox1" HorizontalAlignment="Left" Height="100" Margin="40,40,0,0" VerticalAlignment="Top" Width="210"/>

    </Grid>
</Window>

こんな画面を用意したとします。
Button と ListBox と たった ふたつがある Window ですね。

少し、補足して置きます。
デザイナでコントロールを追加しても、 名前の無いものが配置されます。
これでは、コードからアクセス出来ないので、 x:Name="???" で命名します。
xaml の中に、ゴリゴリとコードで書いて、全て賄う事も、勿論、可能ですが、ここでは、必要最低限にします。

ListBox への項目の追加や操作は、Form の世界なら、基本中の基本です。
でも、WPF にやって来ると、 戸惑います。
だって、かなり、違うのですもの。

何時もの様に、Me.ListBox1.Add("???"") と書いても、表示はされますが、
例えば、 Me.ListBox1.SelectedIndex で選択項目を取得すると、可笑しな値が返されます。
ここが、今回の投稿を書く 事にした きっかけ です。
散々、悩んだ挙句、以下のコードで、項目を調整する事で、対処しました。
この書き方なら、項目の追加や取得は 大丈夫そうです。

この例では、ボタンを押すと、どんどん、項目を追加して行きます。

Class MainWindow
    Friend itemsList As New Dictionary(Of Integer, String)

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        itemsList.Add(1, "Item No 01")
        itemsList.Add(2, "Item No 02")

        Me.ListBox1.ItemsSource = itemsList.Values
    End Sub

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        itemsList.Add(itemsList.Count + 1, "Item No 0x Add " & (itemsList.Count + 1).ToString("00"))
        Me.ListBox1.Items.Refresh()
    End Sub
End Class

また、少し、補足を。


Dictionary を、別途、用意し、 ここに ListBox の項目を保持します。
別に、Dictionary でなくても良いのですが ... 。  Collection とか、List とか、 ... 。  配列でも OK です。
これを ListBox の ItemSource 等にし、指定します。
項目の追加は Dictionary に対して行いますが、
このままでは、ListBox には反映されません。
そこで、 ListBox を Items.Refresh する事で、 最新状態に保つ訳ですね。
追加しても、現在、選択されている項目、 つまり、SelectedIndex の値は保持されています。

項目削除や項目順入れ替えの場合には、
別途、Dictionary 等を操作して、ListBox を Refresh した後で、 ListBox への操作を行います。
例えば、冒頭の項目の既選択状態に変更とか。
この場合、 Refresh した後に、 SelectedIndex が -1 つまり 無選択状態に移行している事がありますので。
注意ですね。



次の投稿の最後にシリーズのリンクを纏めてあります。   VB WPF お勉強 01 印象



[2015/10/05] ソースに配列が可能なので追記
[2015/10/07] 目次 (的な) 投稿へのリンクを追加

0 件のコメント:

コメントを投稿