執筆者: 極東 IT-Engineers 代表、わんくま同盟 森 博之

動作確認環境: Visual Studio 2008 SP1、Silverlight 3、VS2008 SP1 用 Silverlight 3 Toolkit

更新日: 2010 年 4 月 30 日


1. 文字列配列の場合

Code 1 文字配列の設定 [XAML]

XAML
<UserControl x:Class="ListBoxComboBox_SL01_1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480" 
    Loaded="UserControl_Loaded"  <Grid x:Name="LayoutRoot"        <Grid.RowDefinitions            <RowDefinition Height="*" /> 
            <RowDefinition Height="Auto"  /> 
        </Grid.RowDefinitions> 
       
        <!--リストボックスに配列を指定する場合はItemsSourceプロパティに指定する--> 
        <ListBox x:Name="listBox1"   Grid.Row="0" Margin="5" /> 
        <ComboBox x:Name="comboBox1" Grid.Row="1" Margin="5" /> 
    </Grid> 
</UserControl> 
 
 

Code 1 文字配列の設定 [コード ビハインド C#]

C#
using System.Windowsusing System.Windows.Controls; 
 
namespace ListBoxComboBox_SL01_1 
{ 
    public partial class MainPage : UserControl 
    { 
        public MainPage() 
        { 
            InitializeComponent(); 
        } 
 
        private void UserControl_Loaded(object sender, RoutedEventArgs e) 
        { 
            string[] sampleStringData = new string[] 
                                         { 
                                             "ArrayString1",  
                                             "ArrayString2",  
                                             "ArrayString3" 
                                         }; 
            //string配列をセット 
            listBox1.ItemsSource    = sampleStringData; 
            comboBox1.ItemsSource   = sampleStringData; 
        } 
    } 
} 
 
 

Code 1 文字配列の設定 [コード ビハインド VB]

Visual Basic
Partial Public Class MainPage 
    Inherits UserControl 
 
    Public Sub New() 
        InitializeComponent() 
    End Sub 
 
    Private Sub UserControl_Loaded(ByVal sender As System.ObjectByVal e As System.Windows.RoutedEventArgs) 
        Dim sampleStringData As String() = New String() { _ 
                                                "ArrayString1", _ 
                                                "ArrayString2", _ 
                                                "ArrayString3" _ 
                                                } 
 
        listBox1.ItemsSource = sampleStringData 
        comboBox1.ItemsSource = sampleStringData 
    End Sub 
End Class 
 
 

実行結果 1

2. 任意オブジェクト配列の場合

Code 2 任意オブジェクト配列の設定 [XAML]

XAML
<UserControl x:Class="ListBoxComboBox_SL01_2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"
    Loaded="UserControl_Loaded">
    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto"  />
        </Grid.RowDefinitions>
        
        <!--リストボックスに任意オブジェクトのコレクションを指定する場合は
            ItemsSourceプロパティのほかに
            DisplayMemberPathに表示項目のパスを指定する-->
        <ListBox x:Name="listBox1"
            Grid.Row="0" 
            DisplayMemberPath="Name" Margin="5" />
        <ComboBox x:Name="comboBox1"
            Grid.Row="1" 
            DisplayMemberPath="Name" Margin="5" />
    </Grid>
</UserControl>
 

Code 2 任意オブジェクト配列の設定 [コード ビハインド C#]

C#
using System.Windowsusing System.Windows.Controls; 
 
namespace ListBoxComboBox_SL01_2 
{ 
    public partial class MainPage : UserControl 
    { 
        public MainPage() 
        { 
            InitializeComponent(); 
        } 
 
        private void UserControl_Loaded(object sender, RoutedEventArgs e) 
        { 
            Person[] samplePersonData = new Person[] 
                                         { 
                                             new Person() { ID = 1, Name = "新宿 一郎"}, 
                                             new Person() { ID = 2, Name = "初台 次郎"}, 
                                             new Person() { ID = 3, Name = "代田橋 三郎"}, 
                                             new Person() { ID = 4, Name = "大手町 史郎"}, 
                                             new Person() { ID = 5, Name = "調布 五郎"}, 
                                         }; 
 
            //Personオブジェクトの配列をセット 
            listBox1.ItemsSource    = samplePersonData; 
            comboBox1.ItemsSource   = samplePersonData; 
 
 
        } 
    } 
} 
 
 

Code 2 任意オブジェクト配列の設定 [エンティティ クラス C# (Person.cs)]

C#
namespace ListBoxComboBox_SL01_2 
{ 
    public class Person 
    { 
        private int _id; 
        public int ID 
        { 
            get { return _id; } 
            set { _id = value; } 
        } 
 
        private string _name; 
        public string Name 
        { 
            get { return _name; } 
            set { _name = value; } 
        } 
    } 
} 
 
 

Code 2 任意オブジェクト配列の設定 [コード ビハインド VB]

Visual Basic
Partial Public Class MainPage 
    Inherits UserControl 
 
    Public Sub New() 
        InitializeComponent() 
    End Sub 
 
    Private Sub UserControl_Loaded(ByVal sender As System.ObjectByVal e As System.Windows.RoutedEventArgs) 
 
        Dim person1 As New Person(1"新宿 一郎") 
        Dim person2 As New Person(2"初台 次郎") 
        Dim person3 As New Person(3"代田橋 三郎") 
        Dim person4 As New Person(4"大手町 史郎") 
        Dim person5 As New Person(5"調布 五郎") 
 
        Dim samplePersonData As Person() = {person1, person2, person3, person4, person5} 
 
        'Personオブジェクトの配列をセット 
        listBox1.ItemsSource = samplePersonData 
        comboBox1.ItemsSource = samplePersonData 
 
    End Sub 
End Class 
 
 

Code 2 任意オブジェクト配列の設定 [エンティティ クラス VB (Person.vb)]

Visual Basic
Public Class Person 
 
    Public Sub New(ByVal id As IntegerByVal name As String) 
        _id = id 
        _name = name 
    End Sub 
 
    Private _id As Integer 
    Public Property ID() As Integer 
        Get 
            Return _id 
        End Get 
        Set(ByVal value As Integer) 
            _id = value 
        End Set 
    End Property 
 
    Private _name As String 
    Public Property Name() As String 
        Get 
            Return _name 
        End Get 
        Set(ByVal value As String) 
            _name = value 
        End Set 
    End Property 
End Class 
 
 

実行結果 2

3. ListBoxItem/ComboBoxItem を使用した場合

Code 3 XAML によるの設定 [XAML]

XAML
<UserControl x:Class="ListBoxComboBox_SL01_3.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
  <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto"  />
        </Grid.RowDefinitions>

        <!--定数であればListBoxItem/ComboBoxItemsを利用可能-->
        <ListBox Grid.Row="0" Margin="5" >
            <ListBoxItem Content="ListBoxItem1" />
            <ListBoxItem Content="ListBoxItem2" />
            <ListBoxItem Content="ListBoxItem3" />
        </ListBox>

        <ComboBox Grid.Row="1" Margin="5" >
            <ComboBoxItem Content="ComboBoxItem1" />
            <ComboBoxItem Content="ComboBoxItem2" />
            <ComboBoxItem Content="ComboBoxItem3" />
        </ComboBox>
    </Grid>
</UserControl>
 

実行結果 3

ポイント

ListBox, ComboBox コントロールにコレクション オブジェクトを設定するには ItemsSource プロパティに設定を行います。コレクションがプリミティブ型 (int 型、string 型など) のコレクション オブジェクトであれば設定するだけで一覧が表示されます。(上記の「1. 文字列配列の場合」参照)

プリミティブ型でない任意オブジェクトのコレクション クラスの場合、表示用のメンバ・プロパティなどを指定する場合は DisplayMemberPath プロパティにプロパティ パスを指定します。(上記の「2. 任意オブジェクト配列の場合」参照)

プロパティ パスとはソースとなっているオブジェクトのプロパティを走査するための構文です。上記の例のように単一のプロパティをはじめ、インデクサ、複数プロパティ、またテンプレート・スタイルを通じてプロパティにアクセスする場合など多くのオブジェクトのプロパティへアクセスする構文を持ちます。(今回は単一のプロパティを指定することになりますので、プロパティ名をそのまま指定しています。)

また、コレクション クラスでなくとも固定的にデータを指定する場合は ListBox の場合は ListBoxItem オブジェクト、ComboBox は ComboBoxItem オブジェクトによって指定することも可能です。(上記の「3. ListBoxItem/ComboBoxItem を使用した場合」参照)

参考


Code Recipe Code Recipe

ページのトップへ