web-dev-qa-db-ja.com

プログラムでListをListBoxにバインドする

たとえば、次のような非常にシンプルなウィンドウがあるとします。

<Window x:Class="CalendarGenerator.Window1"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="Window1"
        Height="300"
        Width="447">
  <Grid>
    <ListBox Margin="12,40,0,12"
             Name="eventList"
             HorizontalAlignment="Left"
             Width="134" />
  </Grid>
</Window>

そして、次のように定義された単純なリスト:

List<String> ListOfNames = new List<String>();

そして、リストにいくつかの名前があると仮定しましょう。可能な限り多くのコードビハインドを使用して、ListをListBoxにバインドするにはどうすればよいですか?

22

まず、コードビハインドからアクセスできるように、ListBoxに名前を付ける必要があります(edit私はすでにこれを実行しているので、サンプルのListBoxを変更しますあなたを反映する名前):

<ListBox x:Name="eventList" ... />

次に、ListBoxの ItemsSource プロパティをリストに設定するだけです。

eventList.ItemsSource = ListOfNames;

「ListOfNames」オブジェクトをList<String>として定義したので、ListBoxはリストに加えられた変更を自動的に反映しません。リスト内の変更に反応するWPFのデータバインディングを取得するには、代わりに ObservableCollection<String>として定義します。

39
Matt Hamilton

データリストがコードで作成されている場合は、次のようにコードでバインドする必要があります。

eventList.ItemsSource = ListOfNames;

文字列のリストへのバインドは非常に単純な例です。もっと複雑なものを見てみましょう。

あなたが人のクラスを持っているとしましょう:

public class Person {
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

人物のリストを表示するには、リストをListBoxにバインドできますが、WPFに人物オブジェクトの表示方法を伝えていないため、リストボックスには各エントリの「人物」が表示されます。

データオブジェクトを視覚的に表示する方法をWPFに伝えるには、次のようにDataTemplateを定義します。

<Window.Resources>
    <DataTemplate DataType="{x:Type l:Person}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding FirstName}"/>
            <TextBlock Text=" "/>
            <TextBlock Text="{Binding Surname}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox Name="listBox" />
</Grid>

public Window1() {
    InitializeComponent();
    List<Person> people = new List<Person>();
    people.Add(new Person() { FirstName = "Cameron", Surname = "MacFarland" });
    people.Add(new Person() { FirstName = "Bea", Surname = "Stollnitz" });
    people.Add(new Person() { FirstName = "Jason", Surname = "Miesionczek" });
    listBox.ItemsSource = people;
}

これにより、リストに「Firstname Surname」が適切に表示されます。

外観を "、名"に変更したい場合は、XAMLを次のように変更するだけです。

<StackPanel Orientation="Horizontal">
    <TextBlock FontWeight="Bold" Text="{Binding Surname}"/>
    <TextBlock Text=", "/>
    <TextBlock Text="{Binding FirstName}"/>
</StackPanel>
19

バインディングをカスタマイズする場合は、 Binding クラスを使用します。

List<String> listOfNames = new List<String>() {"a", "b"};
Binding myBinding = new Binding();
//set binding parameters if necessary
myBinding.Source = listOfNames;
eventList.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);

または

データをItemsSourceプロパティに直接割り当てます。

eventList.ItemsSource = listOfNames;
15
aku

eventList.ItemsSource = ListOfNames;

2
NotDan