ListPickerコントロールを使う
2011年8月8日(月)
次に、ソリューションエクスプローラー内の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コントロールを使う」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。