ListPickerコントロールを使う

2011年8月8日(月)
PROJECT KySS

次に、ソリューションエクスプローラー内のMainPage.xamlを展開し、表示されるMainPage.xaml.vbをダブルクリックしてリスト5のロジックコードを記述します。

ロジックコードを記述する

リスト5 (MainPage.xaml.vb)

Option Strict On
Imports System.Xml.Linq

PersonalInfoクラス内に文字列型の「氏名」と「年齢」プロパティを定義しておきます。
Public Class PersonalInfo
  Property 氏名 As String
  Property 年齢 As String
End Class

Partial Public Class MainPage
  Inherits PhoneApplicationPage
  ' Constructor
  Public Sub New()
    InitializeComponent()
  End Sub

ページが読み込まれた時の処理

ReadXmlクラスの新しいインスタンスmyReadXml変数を宣言します。
PersonalInfoクラス型の新しいリストである、myPersonalInfoオブジェクト変数を宣言します。
ReadXmlクラスのインスタンスmyReadXmlでReadXmlDoc関数を呼び出します。Descendantsメソッドで取得した<情報>要素のコレクションに対して、各要素を変数 result に格納しながら、PersonalInfoクラスの「氏名」と「年齢」プロパティに、<氏名>と<年齢>要素の値を指定し、AddメソッドでmyPersonalInfoオブジェクトに追加していきます。「年齢」プロパティには文字列「歳」を連結しています。
ListPickerのItemsSourceプロパティにmyPersonalInfoオブジェクトを指定します。
  Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim myReadXml As New ReadXml
    Dim myPersonalInfo As New List(Of PersonalInfo)
 
    For Each result In From c In myReadXml.ReadXmlDoc.Descendants("情報") Select c
      myPersonalInfo.Add(New PersonalInfo With {.氏名 = result.Element("氏名").Value, .年齢 = result.Element("年齢").Value & "歳"})
    Next
    ListPicker1.ItemsSource = myPersonalInfo
  End Sub

ListPickerコントロールから任意の氏名が選択された時の処理

ListPicker1から選択された項目をPersonalInfoクラスにキャストし、その「氏名」を取得します。変数myNameに格納しておきます。
MessageBox.Showメソッドで変数myNameの詳細データを表示するかどうかの、確認メッセージを表示します。[OK]が選択された場合は、NavigationService.Navigateメソッドで、DetailsPage.xamlに遷移します。その際、Nameというキーワードに変数myNameの値を引数として持たせています。[Cancel]が選択された場合は処理を抜けます。
  Private Sub ListPicker1_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListPicker1.SelectionChanged
    Dim myName = DirectCast(ListPicker1.SelectedItem, PersonalInfo).氏名
    Dim kakunin = MessageBox.Show(myName & "さんの詳細データを" & vbCrLf & "表示しますか?", "確認", MessageBoxButton.OKCancel)
    Select Case kakunin
      Case MessageBoxResult.OK
        NavigationService.Navigate(New Uri("/DetailsPage.xaml?Name=" & myName, UriKind.Relative))
      Case MessageBoxResult.Cancel
        Exit Sub
    End Select
  End Sub
End Class

ソリューションエクスプローラー内のDetailsPage.xamlを展開し、表示されるDetailsPage.xaml.vbをダブルクリックしてリスト6のロジックコードを記述します。

リスト6 (DetailsPage.xaml.vb)

Option Strict On
Imports System.Xml.Linq

Personクラス内に文字列型の「年齢、住所、勤務先、空白」プロパティを定義しています。
Public Class Person
  Property 年齢 As String
  Property 住所 As String
  Property 勤務先 As String
  Property 空白 As String
End Class

Partial Public Class DetailPage
  Inherits PhoneApplicationPage
 
  Public Sub New()
    InitializeComponent()
  End Sub

画面の遷移で移動した時に最初に呼ばれるイベント

ここで、MainPage.xamlから渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。
送信時のキーワード(この場合Name)を基に渡された文字列情報を、myParam(“Name”)として取得し、変数myNameに格納します。
x:NameがPageTitleというTextBlockのTextプロパティに変数myNameを指定します。「氏名」が表示されます。
ReadXmlクラスの新しいインスタンスmyReadXml変数を宣言します。
Personクラス型の新しいリストである、myPerson変数を宣言します。
ReadXmlクラスのインスタンスmyReadXmlでReadXmlDoc関数を呼び出します。Descendantsメソッドで取得した<情報>要素の子要素<氏名>の値が、変数myNameに格納されている値に等しいコレクションに対して、各要素を変数 result に格納しながら以下の処理を実行します。
Personクラスの「年齢、住所、勤務先」プロパティに、<年齢>、<住所>、<勤務先>要素の値を指定し、「空白」プロパティには、データの区切り線となる「----」の文字列を指定して、AddメソッドでmyPersonオブジェクトに追加します。
ListBoxのItemsSourceプロパティにmyPersonオブジェクトを指定します。
  Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs)
    Dim myParam As IDictionary(Of String, String) = Me.NavigationContext.QueryString
    Dim myName As String = myParam("Name")
    PageTitle.Text = myName
    Dim myReadXml As New ReadXml

    Dim myPerson As New List(Of Person)

    For Each result In From c In myReadXml.ReadXmlDoc.Descendants("情報") Where c.<氏名>.Value.Equals(myName) Select c
      With myPerson
      .Add(New Person With {.年齢 = "【年 齢】" & result.Element("年齢").Value & "歳",
                                        .住所 = "【住 所】" & result.Element("住所").Value,
                                        .勤務先 = "【勤務先】" & result.Element("勤務先").Value,
                                        .空白 = "------------------------"})
      End With
    Next
    ListBox1.ItemsSource = myPerson
    MyBase.OnNavigatedTo(e)
  End Sub
End Class
  • 「ListPickerコントロールを使う」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています